{"openapi":"3.1.0","info":{"title":"Dot API","description":"Dot API","version":"1.0.0"},"paths":{"/api/auth/{org_id}/{type}/login":{"get":{"tags":["Authentication"],"summary":"Login","operationId":"login_api_auth__org_id___type__login_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"type","in":"path","required":true,"schema":{"type":"string","title":"Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/{org_id}/{type}/auth":{"get":{"tags":["Authentication"],"summary":"Auth","operationId":"auth_api_auth__org_id___type__auth_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"type","in":"path","required":true,"schema":{"type":"string","title":"Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/token":{"post":{"tags":["Authentication"],"summary":"Login For Access Token","operationId":"login_for_access_token_api_auth_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_login_for_access_token_api_auth_token_post"}}},"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/magic_link/request":{"post":{"tags":["Authentication"],"summary":"Request Magic Link","description":"Email a single-use login credential without revealing account existence.","operationId":"request_magic_link_api_auth_magic_link_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_request_magic_link_api_auth_magic_link_request_post"}}},"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/magic_link/consume":{"post":{"tags":["Authentication"],"summary":"Consume Magic Link","description":"Atomically exchange a link token or fallback code for the normal login flow.","operationId":"consume_magic_link_api_auth_magic_link_consume_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_consume_magic_link_api_auth_magic_link_consume_post"}}},"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/register":{"post":{"tags":["Authentication"],"summary":"Register User","operationId":"register_user_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_register_user_api_auth_register_post"}}},"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/resend_verification_mail":{"post":{"tags":["Authentication"],"summary":"Resend Verification Mail","operationId":"resend_verification_mail_api_auth_resend_verification_mail_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_resend_verification_mail_api_auth_resend_verification_mail_post"}}},"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/verify":{"post":{"tags":["Authentication"],"summary":"Verify User","operationId":"verify_user_api_auth_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_verify_user_api_auth_verify_post"}}},"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":["Authentication"],"summary":"Reset Password","operationId":"reset_password_api_auth_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_reset_password_api_auth_reset_password_post"}}},"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/mfa/setup":{"post":{"tags":["Authentication"],"summary":"Mfa Setup","description":"Begin TOTP enrollment.\n\nGenerates a fresh secret, stores it as `totp_pending_secret` (encrypted),\nand returns the otpauth:// provisioning URI. The frontend renders the QR\ncode from that URI. The secret is not promoted to active until the user\nconfirms a code via /mfa/confirm.\n\nTwo callers:\n  - Authenticated user opting in from Profile (current_user via cookie)\n  - Org-enforcement-blocked user finishing first-time enrollment\n    (mfa_token from URL fragment after SSO / password gate)\n\nIdempotent: re-calling replaces any prior pending secret. Rejected if MFA\nis already enabled — the user must disable first.","operationId":"mfa_setup_api_auth_mfa_setup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_mfa_setup_api_auth_mfa_setup_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/mfa/confirm":{"post":{"tags":["Authentication"],"summary":"Mfa Confirm","description":"Confirm enrollment by verifying the first TOTP code.\n\nOn success: promote pending → active secret, generate 10 recovery codes,\npersist their bcrypt hashes, and return the plaintext codes ONCE. The\nfrontend MUST surface them to the user immediately — they are never\nretrievable again.\n\nWhen called with an enrollment pending token (org-enforcement path), the\nresponse *also* carries a full access_token and sets the auth cookie —\nthe user has now satisfied both factors and should be logged in. When\ncalled with an existing session (Profile opt-in), no new session is\nminted; the existing cookie keeps working.","operationId":"mfa_confirm_api_auth_mfa_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_mfa_confirm_api_auth_mfa_confirm_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/mfa/disable":{"post":{"tags":["Authentication"],"summary":"Mfa Disable","description":"Disable MFA. Requires both the user's password AND a valid TOTP code (or\nrecovery code) — disabling MFA is itself a high-trust action.\n\nSSO-only users (no password set) need only supply the code; the active\nsession is the first factor for them. `password` is therefore optional at\nthe schema level and only verified when the user record actually has a\n`hashed_password`.","operationId":"mfa_disable_api_auth_mfa_disable_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_mfa_disable_api_auth_mfa_disable_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/mfa/recovery_codes/regenerate":{"post":{"tags":["Authentication"],"summary":"Mfa Regenerate Recovery Codes","description":"Replace the user's recovery codes with a fresh set. Old codes are\ninvalidated. `password` is optional for the same SSO-only-user reason as\n/mfa/disable: a user without a stored password is authenticated by their\nactive session plus the MFA code.","operationId":"mfa_regenerate_recovery_codes_api_auth_mfa_recovery_codes_regenerate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_mfa_regenerate_recovery_codes_api_auth_mfa_recovery_codes_regenerate_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/mfa/status":{"get":{"tags":["Authentication"],"summary":"Mfa Status","operationId":"mfa_status_api_auth_mfa_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/admin/users/{user_id}/mfa/reset":{"post":{"tags":["Authentication"],"summary":"Admin Reset User Mfa","description":"Admin-only: wipe a user's MFA enrollment so they can re-enroll on next\nlogin. Used when a user has lost their authenticator AND their recovery\ncodes (or when an admin needs to revoke MFA for compliance reasons).\n\nBumps token_version + clears access_tokens to invalidate any live\nsessions of the target user — losing MFA is a security-relevant change.\n\nCross-org admins can't reach this: the route returns 404 if the target\nisn't in the admin's org.","operationId":"admin_reset_user_mfa_api_auth_admin_users__user_id__mfa_reset_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/mfa/recovery/request":{"post":{"tags":["Authentication"],"summary":"Mfa Self Recovery Request","description":"Start self-service MFA recovery and loudly notify the user + admins.\n\nLegacy password users re-enter their password. Explicit magic-link users\nhave already proved their mailbox with the pending primary-factor token;\nSSO and unclassified passwordless identities remain ineligible.","operationId":"mfa_self_recovery_request_api_auth_mfa_recovery_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_mfa_self_recovery_request_api_auth_mfa_recovery_request_post"}}},"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/mfa/recovery/info":{"get":{"tags":["Authentication"],"summary":"Mfa Self Recovery Info","description":"Decode the recovery JWT for the SPA so it can show \"what you're\nabout to do\" metadata (email, original IP/UA, when requested) before the\nuser clicks the disable button.","operationId":"mfa_self_recovery_info_api_auth_mfa_recovery_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"}}}}}}},"/api/auth/mfa/recovery/consume":{"post":{"tags":["Authentication"],"summary":"Mfa Self Recovery Consume","description":"Consume the recovery JWT: wipe MFA fields, invalidate sessions,\naudit, notify. The user is then redirected to /login by the SPA.","operationId":"mfa_self_recovery_consume_api_auth_mfa_recovery_consume_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_mfa_self_recovery_consume_api_auth_mfa_recovery_consume_post"}}},"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/token/mfa":{"post":{"tags":["Authentication"],"summary":"Login Complete With Mfa","description":"Second step of the password login flow: exchange a pending MFA token + a\nvalid TOTP code (or recovery code) for a real session JWT.\n\nRace protection is at the SQLite layer: `claim_totp_counter` and\n`consume_recovery_code` are conditional UPDATEs that succeed only if the\nunderlying value is still the one we verified against. Two concurrent\nrequests with the same captured code race to the UPDATE; one wins, the\nother's WHERE clause fails to match and the request is rejected.","operationId":"login_complete_with_mfa_api_auth_token_mfa_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_login_complete_with_mfa_api_auth_token_mfa_post"}}},"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/embedded_user_login":{"post":{"tags":["Authentication"],"summary":"Get Embedded User Login Token","operationId":"get_embedded_user_login_token_api_auth_embedded_user_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_get_embedded_user_login_token_api_auth_embedded_user_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/me":{"get":{"tags":["Authentication"],"summary":"Read User Me","operationId":"read_user_me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/set_my_default_workspace":{"post":{"tags":["Authentication"],"summary":"Set My Default Workspace","description":"Allow user to set their own default workspace.\nThis endpoint is accessible to all authenticated users.\n\nArgs:\n    workspace_org_id: The workspace org_id to set as default\n    confirm: Must be True to confirm the action (CSRF protection)","operationId":"set_my_default_workspace_api_auth_set_my_default_workspace_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_my_default_workspace_api_auth_set_my_default_workspace_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/user/tokens/mcp":{"get":{"tags":["Authentication"],"summary":"List User Mcp Tokens","description":"List MCP tokens for the current user.\n\nThis endpoint is accessible to ALL authenticated users (not just admins).\nReturns only the user's MCP tokens (tokens with mcp:* scopes).\n\nReturns:\n    List of MCP token metadata (without the actual token values)","operationId":"list_user_mcp_tokens_api_auth_user_tokens_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]},"post":{"tags":["Authentication"],"summary":"Create User Mcp Token","description":"Create an MCP-scoped API token for the current user.\n\nThis endpoint is accessible to ALL authenticated users (not just admins).\nIt creates a token with limited MCP access only.\nEnsures only one active MCP token exists per user.\n\nReturns:\n    Token response with the new MCP token (only shown once)","operationId":"create_user_mcp_token_api_auth_user_tokens_mcp_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/user/tokens/cli":{"post":{"tags":["Authentication"],"summary":"Create User Cli Token","description":"Create an API token for CLI use (Dot CLI).\n\nAccessible to ALL authenticated users. Creates a token with api:full scope.\nRevokes any existing CLI tokens before creating a new one.","operationId":"create_user_cli_token_api_auth_user_tokens_cli_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/cli/login/start":{"post":{"tags":["Authentication"],"summary":"Cli Login Start","description":"Begin a device-style CLI login (no auth — the caller has no credential\nyet, that is the point). Returns a one-time code the CLI shows to a human\ntogether with the authorize URL, plus the short `user_code` the browser\nwill display back so the human can confirm they are approving *this*\nsign-in; the human's browser session completes it.","operationId":"cli_login_start_api_auth_cli_login_start_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/cli/login/info":{"get":{"tags":["Authentication"],"summary":"Cli Login Info","description":"What the approval page shows before the human decides: the verification\ncode to compare against their terminal.\n\nAuthenticated, because only the person who could complete this login has\nany business reading it — and read-only, because it runs on page load,\nbefore consent. Deliberately says nothing about *who* started the sign-in;\nthe code is the only thing the human is asked to match.","operationId":"cli_login_info_api_auth_cli_login_info_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/cli/login/complete":{"post":{"tags":["Authentication"],"summary":"Cli Login Complete","description":"Authorize a pending CLI login from the browser session: mint the CLI\ntoken and park it against the code for the CLI to claim.","operationId":"cli_login_complete_api_auth_cli_login_complete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_cli_login_complete_api_auth_cli_login_complete_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/cli/login/poll":{"get":{"tags":["Authentication"],"summary":"Cli Login Poll","description":"CLI-side poll for a pending login. Unauthenticated by design; the code\nis high-entropy, short-lived, and single-claim — the token is returned at\nmost once and the record is deleted with it.","operationId":"cli_login_poll_api_auth_cli_login_poll_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/user/tokens/mcp/{token_id}":{"delete":{"tags":["Authentication"],"summary":"Delete User Mcp Token","description":"Delete an MCP token for the current user.\n\nThis endpoint is accessible to ALL authenticated users (not just admins).\nUsers can only delete their own MCP tokens.\n\nArgs:\n    token_id: The ID of the MCP token to delete\n\nReturns:\n    Success message","operationId":"delete_user_mcp_token_api_auth_user_tokens_mcp__token_id__delete","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","title":"Token Id"}}],"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":["Authentication"],"summary":"Logout","operationId":"logout_api_auth_logout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_logout_api_auth_logout_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/org_from_email":{"get":{"tags":["Authentication"],"summary":"Get Org From Email","operationId":"get_org_from_email_api_auth_org_from_email_get","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/switch_to_workspace":{"post":{"tags":["Authentication"],"summary":"Switch To Workspace","description":"Switch the current user to a workspace user.\nThe user must already have been added to the workspace.\nReturns the workspace JWT for frontend storage and sets a short-lived\nLastWorkspace hint cookie for server-rendered flows like MCP OAuth.","operationId":"switch_to_workspace_api_auth_switch_to_workspace_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_switch_to_workspace_api_auth_switch_to_workspace_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/switch_to_base_org":{"post":{"tags":["Authentication"],"summary":"Switch To Base Org","description":"Switch the current user back to their base organization.\nWorks from both workspace and base org contexts.","operationId":"switch_to_base_org_api_auth_switch_to_base_org_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_switch_to_base_org_api_auth_switch_to_base_org_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/list_workspaces":{"get":{"tags":["Authentication"],"summary":"List Workspaces","description":"List all workspaces the current user has access to, plus the base organization.\nReturns workspaces where the user is a member and the base org as an option.","operationId":"list_workspaces_api_auth_list_workspaces_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/user_profile":{"get":{"tags":["Authentication"],"summary":"Get User Profile","description":"Return the current user's profile: name, background, and saved memories.","operationId":"get_user_profile_api_auth_user_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]},"put":{"tags":["Authentication"],"summary":"Update User Profile","description":"Update user profile information: name and background (slack_title).\n\nFIELD MAPPING NOTE:\nThe `slack_title` parameter stores the user's \"Background\" field from the UI.\nThis is a legacy naming convention from when the field was used for Slack integration.\nUI label: \"Background\" -> API/DB field: \"slack_title\".\nPersonal notes (formerly \"goals\") are managed via the /user_memory endpoints.","operationId":"update_user_profile_api_auth_user_profile_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_user_profile_api_auth_user_profile_put"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/user_memory":{"post":{"tags":["Authentication"],"summary":"Add User Memory","description":"Add a personal memory to the current user's profile.","operationId":"add_user_memory_api_auth_user_memory_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_add_user_memory_api_auth_user_memory_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/user_memory/{memory_id}":{"put":{"tags":["Authentication"],"summary":"Edit User Memory","description":"Edit an existing personal memory. A user-supplied title wins; without\none the title is regenerated so it keeps tracking the note's content.","operationId":"edit_user_memory_api_auth_user_memory__memory_id__put","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"memory_id","in":"path","required":true,"schema":{"type":"string","title":"Memory Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_edit_user_memory_api_auth_user_memory__memory_id__put"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Authentication"],"summary":"Remove User Memory","description":"Delete a personal memory from the current user's profile.","operationId":"remove_user_memory_api_auth_user_memory__memory_id__delete","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"memory_id","in":"path","required":true,"schema":{"type":"string","title":"Memory Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/get_dismissed_disclaimers":{"get":{"tags":["Authentication"],"summary":"Get Dismissed Disclaimers","description":"Get all dismissed disclaimers for the current user.\nReturns a dict of {disclaimer_hash: true} for compatibility with frontend.","operationId":"get_dismissed_disclaimers_api_auth_get_dismissed_disclaimers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/auth/dismiss_disclaimer":{"post":{"tags":["Authentication"],"summary":"Dismiss Disclaimer","description":"Save that the current user has dismissed a specific disclaimer","operationId":"dismiss_disclaimer_api_auth_dismiss_disclaimer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_dismiss_disclaimer_api_auth_dismiss_disclaimer_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/cli/version":{"get":{"tags":["Chat"],"summary":"Cli Version","description":"Latest CLI version and download URLs. No auth required.","operationId":"cli_version_api_cli_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/cli/download/{platform}":{"get":{"tags":["Chat"],"summary":"Cli Download","description":"Download CLI binary for a given platform. No auth required.","operationId":"cli_download_api_cli_download__platform__get","parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","title":"Platform"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cli/skill":{"get":{"tags":["Chat"],"summary":"Cli Skill","description":"Serve SKILL.md for AI agents. No auth required.","operationId":"cli_skill_api_cli_skill_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/cli/dot.skill":{"get":{"tags":["Chat"],"summary":"Cli Skill Zip","description":"Serve Dot skill as .skill file for claude.ai/Desktop/Cowork upload. No auth required.\n\nA .skill file is a ZIP archive with a root folder matching the skill name\ncontaining SKILL.md. Claude accepts both .zip and .skill uploads.","operationId":"cli_skill_zip_api_cli_dot_skill_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/cli/catalog":{"get":{"tags":["Chat"],"summary":"Cli Catalog","description":"Return org data catalog for CLI consumption. No LLM calls.\n\nReturns capabilities, connections and tables (top 50 by usage): everything an AI\ncoding agent needs to understand the org's data.","operationId":"cli_catalog_api_cli_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/cli/help":{"get":{"tags":["Chat"],"summary":"Cli Help","description":"Answer a question about Dot from the product docs and the rendered API reference.\n\nThis runs outside any chat turn, so the lookup is measured ([COST-BG]) and billed to nobody:\ncharging background work needs a usage receipt and a billing actor that a request like this one\ndoes not carry. That is ENG-1491's job, not this route's. Until then the per-user cap is what\nbounds the spend, and it ignores plan and credit status, which the org limiter does not.","operationId":"cli_help_api_cli_help_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":500,"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/get_initial_suggestions":{"get":{"tags":["Chat"],"summary":"Get Initial Suggestions","description":"Generate personalized initial suggestions for new chats.","operationId":"get_initial_suggestions_api_get_initial_suggestions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/execute_query":{"post":{"tags":["Chat"],"summary":"Execute Query","operationId":"execute_query_api_execute_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_execute_query_api_execute_query_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/context-agent/execute-query":{"post":{"tags":["Chat"],"summary":"Execute Query For Context Agent","description":"Execute a read-only SQL or native Malloy query for Context Agent as CSV.\n\nThis endpoint is designed for Context Agent to run ad-hoc analysis queries.\nThe client saves the returned content inside its own sandbox, and a summary\nis provided for LLM context.\n\nSecurity:\n- Admin-only SQL; modelers may query governed Malloy sources\n- SQL must be SELECT-only; Malloy must run the authorized catalog source\n- Row-level security automatically applied\n- Configurable row limit (default 10,000)\n\nReturns:\n    - csv_content: CSV text for the authenticated client to save locally\n    - summary: Data summary for LLM (row count, columns, sample values)\n    - row_count: Number of rows returned\n    - column_count: Number of columns\n    - execution_time_ms: Query execution time","operationId":"execute_query_for_context_agent_api_context_agent_execute_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_execute_query_for_context_agent_api_context_agent_execute_query_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/rerun_query":{"post":{"tags":["Chat"],"summary":"Rerun Query Route","operationId":"rerun_query_route_api_rerun_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_rerun_query_route_api_rerun_query_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/rerun_agentic_query":{"post":{"tags":["Chat"],"summary":"Rerun Agentic Query Route","operationId":"rerun_agentic_query_route_api_rerun_agentic_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_rerun_agentic_query_route_api_rerun_agentic_query_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/download_big_csv":{"get":{"tags":["Chat"],"summary":"Download Big Csv","operationId":"download_big_csv_api_download_big_csv_get","parameters":[{"name":"chat_id","in":"query","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"message_uuid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Uuid"}},{"name":"message_position","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Message Position"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"}},{"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"}}}}}}},"/api/download_excel":{"get":{"tags":["Chat"],"summary":"Download Excel","operationId":"download_excel_api_download_excel_get","parameters":[{"name":"chat_id","in":"query","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"message_uuid","in":"query","required":true,"schema":{"type":"string","title":"Message Uuid"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"}},{"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"}}}}}}},"/api/download_big_csv_agentic":{"get":{"tags":["Chat"],"summary":"Download Large Csv Agentic","operationId":"download_large_csv_agentic_api_download_big_csv_agentic_get","parameters":[{"name":"chat_id","in":"query","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"df_key","in":"query","required":true,"schema":{"type":"string","title":"Df Key"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/download_excel_agentic":{"get":{"tags":["Chat"],"summary":"Download Excel Agentic","operationId":"download_excel_agentic_api_download_excel_agentic_get","parameters":[{"name":"chat_id","in":"query","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"df_key","in":"query","required":true,"schema":{"type":"string","title":"Df Key"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/upload_to_chat":{"post":{"tags":["Chat"],"summary":"Upload To Chat","description":"Upload a file to a chat session for the agent to analyze.\n\nFiles are stored in data/{org_id}/sessions/{chat_id}/uploads/ and are\naccessible to the sandbox at /dot/session/uploads/.\n\nAccepts data files, text, images, PDFs, and ZIP archives.\nZIP files are automatically extracted with safety checks.\n\nReturns:\n    file_id, original_name, stored_name, size, path_in_sandbox","operationId":"upload_to_chat_api_upload_to_chat_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_to_chat_api_upload_to_chat_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/agentic":{"post":{"tags":["Chat"],"summary":"Agentic","operationId":"agentic_api_agentic_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_agentic_api_agentic_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/agentic/stream":{"post":{"tags":["Chat"],"summary":"Agentic Stream","description":"Send a message to an agentic conversation and stream responses via SSE.\n\n`preview` is what the app editor's preview showed as the message was sent (AppPreview.vue).","operationId":"agentic_stream_api_agentic_stream_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_agentic_stream_api_agentic_stream_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/agentic/subscribe/{chat_id}":{"get":{"tags":["Chat"],"summary":"Agentic Subscribe","description":"Reconnect to a running agentic chat's SSE stream (e.g. after page refresh).","operationId":"agentic_subscribe_api_agentic_subscribe__chat_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agentic_with_history":{"post":{"tags":["Chat"],"summary":"Agentic With History","description":"Run Agentic synchronously for integrations that need the complete response.","operationId":"agentic_with_history_api_agentic_with_history_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_agentic_with_history_api_agentic_with_history_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/agentic/feedback":{"post":{"tags":["Chat"],"summary":"Submit Agentic Feedback","description":"Submit real-time feedback during agent processing.\n\nThis feedback will be injected into the agent's conversation\nafter the current tool execution completes, allowing users to\ncourse-correct the agent while it's working.\n\nArgs:\n    chat_id: The chat session ID\n    feedback: The feedback text from the user\n\nReturns:\n    Status and feedback_id for tracking","operationId":"submit_agentic_feedback_api_agentic_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_submit_agentic_feedback_api_agentic_feedback_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/agentic/stop":{"post":{"tags":["Chat"],"summary":"Stop Agentic Run","description":"Request a graceful stop of an active agentic run.\n\nPushes a high-priority feedback message instructing the LLM to wrap up\nwith a brief summary. The chat finishes normally — no hard abort.","operationId":"stop_agentic_run_api_agentic_stop_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_stop_agentic_run_api_agentic_stop_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/feedback":{"post":{"tags":["Chat"],"summary":"Update Chat History Feedback","operationId":"update_chat_history_feedback_api_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_chat_history_feedback_api_feedback_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/pinChat":{"post":{"tags":["Chat"],"summary":"Update Chat History Pin","operationId":"update_chat_history_pin_api_pinChat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_chat_history_pin_api_pinChat_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/archive_chat":{"post":{"tags":["Chat"],"summary":"Update Chat History Archive","description":"Archive or unarchive a chat","operationId":"update_chat_history_archive_api_archive_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_chat_history_archive_api_archive_chat_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/deleteMessage":{"post":{"tags":["Chat"],"summary":"Update Chat History Delete","operationId":"update_chat_history_delete_api_deleteMessage_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_chat_history_delete_api_deleteMessage_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/chat_history":{"get":{"tags":["Chat"],"summary":"Chat History","description":"One page of the sidebar chat list, newest first.\n\n``limit`` lets a refresh re-read the whole window the user has scrolled to;\na first-page-only refresh would drop whichever row a newly updated chat\ndisplaced past the page boundary. The first page (no cursor) also carries\nevery favorite and the most recent archived chats, so the sidebar and ⌘K\npalette are complete without paging.","operationId":"chat_history_api_chat_history_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"description":"Keyset cursor from a previous page","title":"Cursor"},"description":"Keyset cursor from a previous page"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":40,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/search_chats":{"get":{"tags":["Chat"],"summary":"Search Chats","description":"Chats matching ``q`` across full message bodies — the palette's reach\nbeyond the pages the sidebar has loaded. Own chats only.","operationId":"search_chats_api_search_chats_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","maxLength":200,"description":"Search query","title":"Q"},"description":"Search query"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dismiss_chat_completion":{"post":{"tags":["Chat"],"summary":"Dismiss Chat Completion","description":"Clear the recently_completed flag for a chat after the user has seen it.","operationId":"dismiss_chat_completion_api_dismiss_chat_completion_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_dismiss_chat_completion_api_dismiss_chat_completion_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/share_chat":{"post":{"tags":["Chat"],"summary":"Share Chat","operationId":"share_chat_api_share_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_share_chat_api_share_chat_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/delete_shared_chat":{"post":{"tags":["Chat"],"summary":"Share Chat Delete","operationId":"share_chat_delete_api_delete_shared_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_share_chat_delete_api_delete_shared_chat_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/share_message":{"post":{"tags":["Chat"],"summary":"Share Message","description":"Share an individual message from a chat conversation.\nCreates a new shared chat containing only the specified message and its context.","operationId":"share_message_api_share_message_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_share_message_api_share_message_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/add_label_to_chat":{"post":{"tags":["Chat"],"summary":"Add Label To Chat","operationId":"add_label_to_chat_api_add_label_to_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_add_label_to_chat_api_add_label_to_chat_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/save_message_order":{"post":{"tags":["Chat"],"summary":"Save Message Order","description":"Reorder messages by moving a specific message (or user-assistant block) up or down.\n\nThe backend handles all reordering logic to avoid pagination issues where\nthe frontend only has a subset of messages.\n\nArgs:\n    chat_id: The chat to modify\n    message_uuid: The UUID of the message to move\n    direction: 'up' to move towards beginning, 'down' to move towards end\n    block_mode: If True, move user message and its assistant response together","operationId":"save_message_order_api_save_message_order_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_save_message_order_api_save_message_order_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/c2/{chat_id}":{"get":{"tags":["Chat"],"summary":"Load Chat2","description":"Load chat conversation with optional filtering and pair-based pagination.\n\nPagination is based on user-response pairs:\n- Agentic: initial page defaults to 1 pair; history pages advertise 5\n- Non-agentic: initial and history pages default to 5 pairs\n\nUse offset to load older pairs (offset=0 = most recent, offset=1 = skip 1 pair, etc.)\nUse include_all=true to get all messages without filtering (useful for debugging).\n\nCredits: an answer's cost is the `credits` of its timeline `completed` event, and its\n`message_uuid` is the `message_id` of its /api/export_history row. An answer copied from\nanother chat has `copied_from_chat_id` instead of `credits`.","operationId":"load_chat2_api_c2__chat_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"include_all","in":"query","required":false,"schema":{"type":"boolean","description":"Include all messages including tool messages","default":false,"title":"Include All"},"description":"Include all messages including tool messages"},{"name":"pairs","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Number of user-response pairs to return","title":"Pairs"},"description":"Number of user-response pairs to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of pairs to skip (0 = most recent)","default":0,"title":"Offset"},"description":"Number of pairs to skip (0 = most recent)"},{"name":"page_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Page Only"}},{"name":"message_uuid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Deep-link target. When set, locate the pair containing this message and return just that pair.","title":"Message Uuid"},"description":"Deep-link target. When set, locate the pair containing this message and return just that pair."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/c2/{chat_id}/lineage/{message_id}":{"get":{"tags":["Chat"],"summary":"Answer Lineage","description":"Where one chat answer's data comes from: notes → answer ← queries ← tables ← dbt.\n\nMember-only, mirroring the app lineage endpoint — share/embed views get no graph.\nAccess is exactly load_chat2's: own chats, plus the admin/modeler bypass.","operationId":"answer_lineage_api_c2__chat_id__lineage__message_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"message_id","in":"path","required":true,"schema":{"type":"string","title":"Message Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/c2/{chat_id}/lineage/{message_id}/column":{"get":{"tags":["Chat"],"summary":"Answer Lineage Column","description":"Trace one output column of one answer dataframe back to its source columns.","operationId":"answer_lineage_column_api_c2__chat_id__lineage__message_id__column_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"message_id","in":"path","required":true,"schema":{"type":"string","title":"Message Id"}},{"name":"query","in":"query","required":true,"schema":{"type":"string","title":"Query"}},{"name":"column","in":"query","required":true,"schema":{"type":"string","title":"Column"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/share/{chat_id}":{"get":{"tags":["Chat"],"summary":"Load Chat","description":"Load a public shared chat with display filtering and pair-based pagination.\n\nOnly messages that are displayed to the user are returned (role='user',\ndisplay_to_user tool messages, messages with additional_data or\nsuggested_follow_ups). Pagination mirrors load_chat2 — most-recent-first\npairs, with a one-pair agentic initial page and five-pair history batches.\nResponses are always bounded: a shared chat can decode to hundreds of MB,\nwhich no browser can parse.","operationId":"load_chat_api_share__chat_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"org_id","in":"query","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"pairs","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Number of user-response pairs to return","title":"Pairs"},"description":"Number of user-response pairs to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of pairs to skip (0 = most recent)","default":0,"title":"Offset"},"description":"Number of pairs to skip (0 = most recent)"},{"name":"page_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Page Only"}},{"name":"message_uuid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Uuid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/share_thread/{chat_id}":{"get":{"tags":["Chat"],"summary":"Load Shared Thread","description":"Read-only thread contents for a publicly shared chat.\n\nMirrors the owner's lineage thread off `source_message_uuid` so a share-link\nviewer can read the follow-up conversation. Gated on the parent chat being\npublic and the org's share-view setting; no write/continue path (the panel\nhides its input in shared mode).","operationId":"load_shared_thread_api_share_thread__chat_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"org_id","in":"query","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"source_message_uuid","in":"query","required":true,"schema":{"type":"string","title":"Source Message Uuid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/fork_shared_chat":{"post":{"tags":["Chat"],"summary":"Fork Shared Chat","description":"Fork a public shared chat into a new private chat owned by the current user.\nAccepts an optional source_org_id to support cross-workspace forking: the shared\nchat may live in a different workspace or the parent org. Only allowed when both\norgs share the same parent org (or one is the parent of the other).","operationId":"fork_shared_chat_api_fork_shared_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_fork_shared_chat_api_fork_shared_chat_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/suggest_title":{"post":{"tags":["Chat"],"summary":"Suggest Title","operationId":"suggest_title_api_suggest_title_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_suggest_title_api_suggest_title_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/change_title":{"post":{"tags":["Chat"],"summary":"Change Title","operationId":"change_title_api_change_title_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_change_title_api_change_title_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/edit_visualization":{"post":{"tags":["Chat"],"summary":"Edit Visualization Route","description":"Edit an existing visualization by modifying the prompt with user's requested changes.\nAgentic charts redraw the stored data; classic charts re-run the original query.","operationId":"edit_visualization_route_api_edit_visualization_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_edit_visualization_route_api_edit_visualization_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/save_cached_chart":{"post":{"tags":["Chat"],"summary":"Save Cached Chart","description":"Save a cached chart edit to the conversation.\nValidates the cache token and updates the message with the cached chart data.","operationId":"save_cached_chart_api_save_cached_chart_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_save_cached_chart_api_save_cached_chart_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/restore_chart_version":{"post":{"tags":["Chat"],"summary":"Restore Chart Version","description":"Restore an earlier version of an agentic chart as the current chart.\nAppends a new version entry instead of rewriting history.","operationId":"restore_chart_version_api_restore_chart_version_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_restore_chart_version_api_restore_chart_version_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/sync/{connection_type}/{connection_id}":{"post":{"tags":["Connections"],"summary":"Sync connection with an API token.","operationId":"sync_connection_api_sync__connection_type___connection_id__post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]},{"QueryTokenAuth":[]}],"parameters":[{"name":"connection_type","in":"path","required":true,"schema":{"type":"string","title":"Connection Type"}},{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/init/{connection_type}/{connection_id}":{"post":{"tags":["Connections"],"summary":"Sync Connection General","operationId":"sync_connection_general_api_init__connection_type___connection_id__post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"connection_type","in":"path","required":true,"schema":{"type":"string","title":"Connection Type"}},{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_sync_connection_general_api_init__connection_type___connection_id__post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cancel_sync/{connection_type}/{connection_id}":{"post":{"tags":["Connections"],"summary":"Cancel Sync","description":"Kill a running sync for a connection by revoking its Celery task.","operationId":"cancel_sync_api_cancel_sync__connection_type___connection_id__post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"connection_type","in":"path","required":true,"schema":{"type":"string","title":"Connection Type"}},{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/connect_snowflake":{"post":{"tags":["Connections"],"summary":"Connect","operationId":"connect_api_connect_snowflake_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_api_connect_snowflake_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/immuta_settings":{"get":{"tags":["Connections"],"summary":"Get Immuta Settings","description":"Immuta config for the Connections card. The key is never returned, only whether one is stored.","operationId":"get_immuta_settings_api_immuta_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/save_immuta_settings":{"post":{"tags":["Connections"],"summary":"Save Immuta Settings","description":"Store the org's Immuta tenant and agent key. An empty tenant_url clears both and\ndetaches every governed connection, since leaving them on would deny every query.","operationId":"save_immuta_settings_api_save_immuta_settings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_save_immuta_settings_api_save_immuta_settings_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/test_immuta":{"post":{"tags":["Connections"],"summary":"Test Immuta","description":"Vend a role against the connection's Immuta tenant so a broken credential surfaces\nhere, not on the first user question — where fail closed means nobody can query.\n\n``userid`` names the Immuta user to vend for, defaulting to the calling admin. An\nadmin who is not themselves an Immuta user would otherwise only ever see a\nuser-not-found error and read it as a broken integration.","operationId":"test_immuta_api_test_immuta_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_test_immuta_api_test_immuta_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/update_snowflake_settings":{"post":{"tags":["Connections"],"summary":"Update Snowflake Settings","operationId":"update_snowflake_settings_api_update_snowflake_settings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_snowflake_settings_api_update_snowflake_settings_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/update_bigquery_settings":{"post":{"tags":["Connections"],"summary":"Update Bigquery Settings","description":"Save the per-user access toggles without re-testing credentials.\n\nThey stay live once the connection is synced, so routing them through\nconnect_bigquery would make an admin retype the key just to flip a switch.","operationId":"update_bigquery_settings_api_update_bigquery_settings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_bigquery_settings_api_update_bigquery_settings_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/update_looker_settings":{"post":{"tags":["Connections"],"summary":"Update Looker Settings","operationId":"update_looker_settings_api_update_looker_settings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_looker_settings_api_update_looker_settings_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_bigquery":{"post":{"tags":["Connections"],"summary":"Connect Bg","operationId":"connect_bg_api_connect_bigquery_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_bg_api_connect_bigquery_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_redshift":{"post":{"tags":["Connections"],"summary":"Connect Red","operationId":"connect_red_api_connect_redshift_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_red_api_connect_redshift_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_postgres":{"post":{"tags":["Connections"],"summary":"Connect Pg","operationId":"connect_pg_api_connect_postgres_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_pg_api_connect_postgres_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_supabase":{"post":{"tags":["Connections"],"summary":"Connect Supabase","operationId":"connect_supabase_api_connect_supabase_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_supabase_api_connect_supabase_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_neon":{"post":{"tags":["Connections"],"summary":"Connect Neon","operationId":"connect_neon_api_connect_neon_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_neon_api_connect_neon_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_foxdb":{"post":{"tags":["Connections"],"summary":"Connect Fox","operationId":"connect_fox_api_connect_foxdb_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_fox_api_connect_foxdb_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_databricks":{"post":{"tags":["Connections"],"summary":"Connect Dbricks","operationId":"connect_dbricks_api_connect_databricks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_dbricks_api_connect_databricks_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_mssql":{"post":{"tags":["Connections"],"summary":"Connect Ms","operationId":"connect_ms_api_connect_mssql_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_ms_api_connect_mssql_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_fabric":{"post":{"tags":["Connections"],"summary":"Connect Fabric Route","operationId":"connect_fabric_route_api_connect_fabric_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_fabric_route_api_connect_fabric_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/powerbi/oauth/initiate":{"post":{"tags":["Connections"],"summary":"Powerbi Oauth Initiate","description":"Initiate PowerBI Interactive SSO OAuth flow using Dot's multi-tenant Azure AD app.\n\nReturns authorization URL for popup window. Tenant is automatically discovered after authentication.","operationId":"powerbi_oauth_initiate_api_powerbi_oauth_initiate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_powerbi_oauth_initiate_api_powerbi_oauth_initiate_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/powerbi/oauth/callback":{"get":{"tags":["Connections"],"summary":"Powerbi Oauth Callback","description":"Handle OAuth callback from Microsoft with automatic tenant discovery.\n\nThis endpoint:\n1. Validates state parameter (CSRF protection)\n2. Exchanges authorization code for tokens\n3. Extracts tenant_id from token claims\n4. Stores refresh token in database (encrypted)\n5. Returns HTML that closes popup and notifies parent window","operationId":"powerbi_oauth_callback_api_powerbi_oauth_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"type":"string","title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/aas/oauth/initiate":{"post":{"tags":["Connections"],"summary":"Aas Oauth Initiate","description":"Initiate Azure Analysis Services OAuth flow using Dot's multi-tenant Azure AD app.\n\nReturns authorization URL for popup window. Tenant is automatically discovered after authentication.","operationId":"aas_oauth_initiate_api_aas_oauth_initiate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_aas_oauth_initiate_api_aas_oauth_initiate_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/aas/oauth/callback":{"get":{"tags":["Connections"],"summary":"Aas Oauth Callback","description":"Handle AAS OAuth callback from Microsoft with automatic tenant discovery.\n\nThis endpoint:\n1. Validates state parameter (CSRF protection)\n2. Exchanges authorization code for tokens\n3. Extracts tenant_id from token claims\n4. Stores refresh token in database (encrypted)\n5. Tests connection by listing databases on the AAS server\n6. Returns HTML that closes popup and notifies parent window","operationId":"aas_oauth_callback_api_aas_oauth_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"type":"string","title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/aas/connect_sp":{"post":{"tags":["Connections"],"summary":"Aas Connect Service Principal","description":"Connect to Azure Analysis Services using Service Principal (client credentials).\n\nAcquires a token via MSAL client credentials flow and tests by listing databases.","operationId":"aas_connect_service_principal_api_aas_connect_sp_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_aas_connect_service_principal_api_aas_connect_sp_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_duckdb":{"post":{"tags":["Connections"],"summary":"Connect Duckdb Api","operationId":"connect_duckdb_api_api_connect_duckdb_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_duckdb_api_api_connect_duckdb_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_usagedb":{"post":{"tags":["Connections"],"summary":"Connect Usagedb Api","operationId":"connect_usagedb_api_api_connect_usagedb_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_google_sheets":{"post":{"tags":["Connections"],"summary":"Connect Google Sheets Route","operationId":"connect_google_sheets_route_api_connect_google_sheets_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_google_sheets_route_api_connect_google_sheets_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_looker":{"post":{"tags":["Connections"],"summary":"Connect Look","operationId":"connect_look_api_connect_looker_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_look_api_connect_looker_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_atlassian":{"post":{"tags":["Connections"],"summary":"Connect Atlassian Api","operationId":"connect_atlassian_api_api_connect_atlassian_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_atlassian_api_api_connect_atlassian_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_notion":{"post":{"tags":["Connections"],"summary":"Connect Notion Api","description":"Token-paste path for Notion. Used by self-hosted installs and the\nfallback flow in the UI when Public OAuth isn't available. The OAuth flow\nlives at ``/api/oauth/notion/{start,callback}``.","operationId":"connect_notion_api_api_connect_notion_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_notion_api_api_connect_notion_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_slite":{"post":{"tags":["Connections"],"summary":"Connect Slite Api","operationId":"connect_slite_api_api_connect_slite_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_slite_api_api_connect_slite_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_mixpanel":{"post":{"tags":["Connections"],"summary":"Connect Mixpanel Api","operationId":"connect_mixpanel_api_api_connect_mixpanel_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_mixpanel_api_api_connect_mixpanel_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/notion/reachable_pages":{"post":{"tags":["Connections"],"summary":"Notion Reachable Pages","description":"List the first ``limit`` pages reachable to the connected Notion integration.\n\nUsed by the connection-tab UI to give the admin a live \"is this connection\nactually working?\" debug view right after Connect — Notion's per-page\nsharing model otherwise leaves admins guessing.","operationId":"notion_reachable_pages_api_notion_reachable_pages_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_notion_reachable_pages_api_notion_reachable_pages_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/oauth/notion/start":{"get":{"tags":["Connections"],"summary":"Notion Oauth Start","description":"Begin the Notion Public-OAuth flow.\n\nGenerates a CSRF-bound state token (org_id + nonce + 5-minute timestamp)\nHMAC-signed with ``Config.SECRET_KEY``, and returns the Notion authorize\nURL. The frontend redirects (or pops a window) to that URL. Notion bounces\nback to ``/api/oauth/notion/callback`` with ``code`` + ``state``.\n\nSigning the state prevents cross-tenant binding: an attacker cannot forge a\nstate that points at a different org_id without the secret key.","operationId":"notion_oauth_start_api_oauth_notion_start_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/oauth/notion/callback":{"get":{"tags":["Connections"],"summary":"Notion Oauth Callback","description":"Exchange the authorization code for tokens, persist on the connection.\n\nState carries org_id + a timestamp (max 5 min old) and is HMAC-signed with\n``Config.SECRET_KEY``. The signature is verified before any field is\ntrusted — without it, a caller who knew another org's id could bind tokens\nto the wrong org. On success we POST code + grant_type=authorization_code\nto ``/v1/oauth/token`` with HTTP Basic ``client_id:client_secret``. The\nresponse includes ``access_token``, ``refresh_token``, ``workspace_name``,\n``workspace_icon``, ``workspace_id``, ``bot_id``, and ``owner`` — we\npersist all of those.","operationId":"notion_oauth_callback_api_oauth_notion_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/oauth/google-ads/start":{"get":{"tags":["Connections"],"summary":"Google Ads Oauth Start","description":"Ask the replicator for the Google authorize URL.\n\nThe replicator owns the OAuth client + developer token and signs the state\nbinding org_id to this consent flow; dot just hands the org_id over and\nforwards the URL to the user's browser. Nothing Google-Ads-specific lives\non dot.","operationId":"google_ads_oauth_start_api_oauth_google_ads_start_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/oauth/google-ads/callback":{"get":{"tags":["Connections"],"summary":"Google Ads Oauth Callback","description":"Receive Google's redirect; forward code+state to the replicator; store.\n\nState signing/verification happens inside the replicator (it signed it).\nThe replicator returns ``{org_id, refresh_token, customer_id, accounts}``;\ndot binds the result to org_id and persists via the existing replication\nstorage. The refresh token never reaches the browser.","operationId":"google_ads_oauth_callback_api_oauth_google_ads_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/connect_dbt":{"post":{"tags":["Connections"],"summary":"Connect Dbt Api","operationId":"connect_dbt_api_api_connect_dbt_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_dbt_api_api_connect_dbt_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_code_repository":{"post":{"tags":["Connections"],"summary":"Connect Code Repository Api","operationId":"connect_code_repository_api_api_connect_code_repository_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_code_repository_api_api_connect_code_repository_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_cubejs":{"post":{"tags":["Connections"],"summary":"Connect Cubejs Api","operationId":"connect_cubejs_api_api_connect_cubejs_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_cubejs_api_api_connect_cubejs_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_steep":{"post":{"tags":["Connections"],"summary":"Connect Steep Api","operationId":"connect_steep_api_api_connect_steep_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_steep_api_api_connect_steep_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_malloy":{"post":{"tags":["Connections"],"summary":"Connect Malloy Api","operationId":"connect_malloy_api_api_connect_malloy_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_malloy_api_api_connect_malloy_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/inspect_malloy_repo":{"post":{"tags":["Connections"],"summary":"Inspect Malloy Repo Api","description":"Read a Malloy repo's malloy-config.json so the UI can show which secret it needs.","operationId":"inspect_malloy_repo_api_api_inspect_malloy_repo_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_inspect_malloy_repo_api_api_inspect_malloy_repo_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_saphana":{"post":{"tags":["Connections"],"summary":"Connect Saphana Api","operationId":"connect_saphana_api_api_connect_saphana_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_saphana_api_api_connect_saphana_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_mysql":{"post":{"tags":["Connections"],"summary":"Connect Mysql Api","operationId":"connect_mysql_api_api_connect_mysql_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_mysql_api_api_connect_mysql_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_oracle":{"post":{"tags":["Connections"],"summary":"Connect Oracle Api","operationId":"connect_oracle_api_api_connect_oracle_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_oracle_api_api_connect_oracle_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_tableau":{"post":{"tags":["Connections"],"summary":"Connect Tableau Route","operationId":"connect_tableau_route_api_connect_tableau_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_tableau_route_api_connect_tableau_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_metabase":{"post":{"tags":["Connections"],"summary":"Connect Metabase Route","operationId":"connect_metabase_route_api_connect_metabase_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_metabase_route_api_connect_metabase_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_sigma":{"post":{"tags":["Connections"],"summary":"Connect Sigma Route","operationId":"connect_sigma_route_api_connect_sigma_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_sigma_route_api_connect_sigma_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_secrets":{"post":{"tags":["Connections"],"summary":"Connect Secrets Route","operationId":"connect_secrets_route_api_connect_secrets_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_secrets_route_api_connect_secrets_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_athena":{"post":{"tags":["Connections"],"summary":"Connect Athena Route","operationId":"connect_athena_route_api_connect_athena_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_athena_route_api_connect_athena_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_clickhouse":{"post":{"tags":["Connections"],"summary":"Connect Clickhouse Route","operationId":"connect_clickhouse_route_api_connect_clickhouse_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_clickhouse_route_api_connect_clickhouse_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_firebolt":{"post":{"tags":["Connections"],"summary":"Connect Firebolt Route","operationId":"connect_firebolt_route_api_connect_firebolt_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_firebolt_route_api_connect_firebolt_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/remove_connection":{"post":{"tags":["Connections"],"summary":"Remove Connection","description":"Remove a connection. Active tables keep their setup unless delete_data is set.","operationId":"remove_connection_api_remove_connection_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_remove_connection_api_remove_connection_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connections":{"get":{"tags":["Connections"],"summary":"Get Connections","operationId":"get_connections_api_connections_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/deactivate_plugin":{"post":{"tags":["Connections"],"summary":"Deactivate Plugin Route","operationId":"deactivate_plugin_route_api_deactivate_plugin_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_deactivate_plugin_route_api_deactivate_plugin_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connection/update_all_tables":{"post":{"tags":["Connections"],"summary":"Update Activate All Tables","operationId":"update_activate_all_tables_api_connection_update_all_tables_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_activate_all_tables_api_connection_update_all_tables_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connection/update_table_filter":{"post":{"tags":["Connections"],"summary":"Update Table Filter","description":"Persist the object glob filter so it applies to future manual and\nscheduled syncs. Empty string clears the filter (sync everything).","operationId":"update_table_filter_api_connection_update_table_filter_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_table_filter_api_connection_update_table_filter_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connection/update_groups":{"post":{"tags":["Connections"],"summary":"Update Connection Groups","description":"Set the access groups on a connection. Admins and modelers only.\n\nEmpty/missing groups collapse to `[\"all_users\"]` so a connection never\nbecomes orphaned and invisible to everyone.","operationId":"update_connection_groups_api_connection_update_groups_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_connection_groups_api_connection_update_groups_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connection/update_overwrite_comments":{"post":{"tags":["Connections"],"summary":"Update Overwrite Comments On Sync","description":"Update the overwrite_comments_on_sync setting for a connection.\nWhen enabled, source column descriptions take precedence over Dot context. Both are retained.","operationId":"update_overwrite_comments_on_sync_api_connection_update_overwrite_comments_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_overwrite_comments_on_sync_api_connection_update_overwrite_comments_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/environments":{"get":{"tags":["environments"],"summary":"List Environments","operationId":"list_environments_api_environments_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]},"post":{"tags":["environments"],"summary":"Create Environment","operationId":"create_environment_api_environments_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/environments/current":{"get":{"tags":["environments"],"summary":"Current Environment","operationId":"current_environment_api_environments_current_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/environments/{env_id}":{"get":{"tags":["environments"],"summary":"Get Environment","operationId":"get_environment_api_environments__env_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"env_id","in":"path","required":true,"schema":{"type":"string","title":"Env Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["environments"],"summary":"Update Environment","operationId":"update_environment_api_environments__env_id__patch","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"env_id","in":"path","required":true,"schema":{"type":"string","title":"Env Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["environments"],"summary":"Delete Environment","operationId":"delete_environment_api_environments__env_id__delete","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"env_id","in":"path","required":true,"schema":{"type":"string","title":"Env Id"}},{"name":"confirm","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Confirm"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/environments/{env_id}/persist":{"post":{"tags":["environments"],"summary":"Persist Environment","description":"Keep a throwaway environment: exempt it from the retention sweep and make\nit eligible for the Git mirror.","operationId":"persist_environment_api_environments__env_id__persist_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"env_id","in":"path","required":true,"schema":{"type":"string","title":"Env Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/environments/{env_id}/diff":{"get":{"tags":["environments"],"summary":"Diff Environment","operationId":"diff_environment_api_environments__env_id__diff_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"env_id","in":"path","required":true,"schema":{"type":"string","title":"Env Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/environments/{env_id}/conflicts":{"get":{"tags":["environments"],"summary":"Conflicts Environment","operationId":"conflicts_environment_api_environments__env_id__conflicts_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"env_id","in":"path","required":true,"schema":{"type":"string","title":"Env Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/environments/merge":{"post":{"tags":["environments"],"summary":"Merge Environments","operationId":"merge_environments_api_environments_merge_post","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/EnvironmentMergePreviewCommand"},{"$ref":"#/components/schemas/EnvironmentMergeApplyCommand"}],"title":"Payload","discriminator":{"propertyName":"operation","mapping":{"preview":"#/components/schemas/EnvironmentMergePreviewCommand","apply":"#/components/schemas/EnvironmentMergeApplyCommand"}}}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/environments/{env_id}/merge":{"post":{"tags":["environments"],"summary":"Merge Environment","operationId":"merge_environment_api_environments__env_id__merge_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"env_id","in":"path","required":true,"schema":{"type":"string","title":"Env Id"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"default":{},"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/environments/{env_id}/proposal":{"post":{"tags":["environments"],"summary":"Create Environment Proposal","operationId":"create_environment_proposal_api_environments__env_id__proposal_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"env_id","in":"path","required":true,"schema":{"type":"string","title":"Env Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_create_environment_proposal_api_environments__env_id__proposal_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvironmentProposalResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/environments/{env_id}/sync_target":{"post":{"tags":["environments"],"summary":"Sync Environment Target","description":"Refresh the env's table docs from its dev warehouse target (W3).","operationId":"sync_environment_target_api_environments__env_id__sync_target_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"env_id","in":"path","required":true,"schema":{"type":"string","title":"Env Id"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"default":{},"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/environments/{env_id}/targets":{"put":{"tags":["environments"],"summary":"Set Targets","operationId":"set_targets_api_environments__env_id__targets_put","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"env_id","in":"path","required":true,"schema":{"type":"string","title":"Env Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/malloy/warehouses":{"get":{"tags":["Malloy projects"],"summary":"List Warehouses","operationId":"list_warehouses_api_malloy_warehouses_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/malloy/projects":{"get":{"tags":["Malloy projects"],"summary":"List Projects","operationId":"list_projects_api_malloy_projects_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]},"post":{"tags":["Malloy projects"],"summary":"Create Project","operationId":"create_project_api_malloy_projects_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProject"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/malloy/projects/{project_id}":{"get":{"tags":["Malloy projects"],"summary":"Show Project","operationId":"show_project_api_malloy_projects__project_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/malloy/projects/{project_id}/files":{"get":{"tags":["Malloy projects"],"summary":"Inspect Project","operationId":"inspect_project_api_malloy_projects__project_id__files_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/malloy/projects/{project_id}/validate":{"post":{"tags":["Malloy projects"],"summary":"Validate Project","operationId":"validate_project_api_malloy_projects__project_id__validate_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/malloy/projects/{project_id}/sync":{"post":{"tags":["Malloy projects"],"summary":"Sync Project","operationId":"sync_project_api_malloy_projects__project_id__sync_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/model/files":{"get":{"tags":["Model files"],"summary":"List Model Files","operationId":"list_model_files_api_model_files_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/model/file":{"get":{"tags":["Model files"],"summary":"Get Model File","operationId":"get_model_file_api_model_file_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"path","in":"query","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evaluations/prepare":{"post":{"tags":["evaluations","evaluations"],"summary":"Prepare","operationId":"prepare_api_evaluations_prepare_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationPrepareRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Prepare Api Evaluations Prepare Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/evaluations/interview_chat":{"post":{"tags":["evaluations"],"summary":"Create Interview Chat","operationId":"create_interview_chat_api_evaluations_interview_chat_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Interview Chat Api Evaluations Interview Chat Post"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/evaluations":{"post":{"tags":["evaluations"],"summary":"Create","operationId":"create_api_evaluations_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Api Evaluations Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["evaluations"],"summary":"List All","operationId":"list_all_api_evaluations_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"include_archived","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Archived"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List All Api Evaluations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evaluations/target":{"get":{"tags":["evaluations"],"summary":"Get Target","description":"Read the current committed Dot context SHA before configuring a CI run.","operationId":"get_target_api_evaluations_target_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"environment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Environment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Target Api Evaluations Target Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evaluations/unit_options":{"get":{"tags":["evaluations"],"summary":"Get Unit Options","operationId":"get_unit_options_api_evaluations_unit_options_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Unit Options Api Evaluations Unit Options Get"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/evaluations/{evaluation_id}":{"get":{"tags":["evaluations"],"summary":"Get","operationId":"get_api_evaluations__evaluation_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Api Evaluations  Evaluation Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["evaluations"],"summary":"Update","operationId":"update_api_evaluations__evaluation_id__patch","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Api Evaluations  Evaluation Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["evaluations"],"summary":"Archive","operationId":"archive_api_evaluations__evaluation_id__delete","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Archive Api Evaluations  Evaluation Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evaluations/{evaluation_id}/variants":{"get":{"tags":["evaluations"],"summary":"List Variants","operationId":"list_variants_api_evaluations__evaluation_id__variants_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Variants Api Evaluations  Evaluation Id  Variants Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evaluations/{evaluation_id}/versions":{"get":{"tags":["evaluations"],"summary":"List Versions","operationId":"list_versions_api_evaluations__evaluation_id__versions_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Versions Api Evaluations  Evaluation Id  Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evaluations/{evaluation_id}/versions/{version}/restore":{"post":{"tags":["evaluations"],"summary":"Restore Version","operationId":"restore_version_api_evaluations__evaluation_id__versions__version__restore_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}},{"name":"version","in":"path","required":true,"schema":{"type":"string","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Restore Version Api Evaluations  Evaluation Id  Versions  Version  Restore Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evaluations/{evaluation_id}/questions":{"get":{"tags":["evaluations"],"summary":"List Questions","operationId":"list_questions_api_evaluations__evaluation_id__questions_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}},{"name":"include_inactive","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Inactive"}},{"name":"version","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":7,"maxLength":40,"pattern":"^[0-9a-f]+$"},{"type":"null"}],"title":"Version"}},{"name":"environment","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":64},{"type":"null"}],"title":"Environment"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Questions Api Evaluations  Evaluation Id  Questions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["evaluations"],"summary":"Create Question","operationId":"create_question_api_evaluations__evaluation_id__questions_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationQuestionCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Question Api Evaluations  Evaluation Id  Questions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evaluations/{evaluation_id}/questions/{question_id}":{"patch":{"tags":["evaluations"],"summary":"Update Question","operationId":"update_question_api_evaluations__evaluation_id__questions__question_id__patch","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}},{"name":"question_id","in":"path","required":true,"schema":{"type":"string","title":"Question Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationQuestionUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Question Api Evaluations  Evaluation Id  Questions  Question Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["evaluations"],"summary":"Delete Question","operationId":"delete_question_api_evaluations__evaluation_id__questions__question_id__delete","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}},{"name":"question_id","in":"path","required":true,"schema":{"type":"string","title":"Question Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Question Api Evaluations  Evaluation Id  Questions  Question Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evaluations/{evaluation_id}/runs":{"post":{"tags":["evaluations"],"summary":"Create Run","operationId":"create_run_api_evaluations__evaluation_id__runs_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationRunCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Run Api Evaluations  Evaluation Id  Runs Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["evaluations"],"summary":"List Runs","operationId":"list_runs_api_evaluations__evaluation_id__runs_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"evaluation_id","in":"path","required":true,"schema":{"type":"string","title":"Evaluation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Runs Api Evaluations  Evaluation Id  Runs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evaluation_runs/{run_id}/cancel":{"post":{"tags":["evaluations"],"summary":"Cancel Run","operationId":"cancel_run_api_evaluation_runs__run_id__cancel_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Run Api Evaluation Runs  Run Id  Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/evaluation_runs/{run_id}":{"get":{"tags":["evaluations"],"summary":"Get Run","operationId":"get_run_api_evaluation_runs__run_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Run Api Evaluation Runs  Run Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tables":{"get":{"tags":["Assets"],"summary":"Get Tables","operationId":"get_tables_api_tables_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"lite","in":"query","required":false,"schema":{"type":"boolean","embed":false,"default":false,"title":"Lite"}},{"name":"training_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tables/{table_id}":{"get":{"tags":["Assets"],"summary":"Get Table","operationId":"get_table_api_tables__table_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"table_id","in":"path","required":true,"schema":{"type":"string","title":"Table Id"}},{"name":"training_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tables/bulk":{"post":{"tags":["Assets"],"summary":"Get Tables Bulk","description":"Read several full table documents in one request, each as GET /tables/{id} would return it.\n\nIds that don't resolve are omitted. One round trip replaces the per-id fan-out; the reads\nthemselves stay on `get_doc`, so the list and the drawer can never see different shapes.","operationId":"get_tables_bulk_api_tables_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_get_tables_bulk_api_tables_bulk_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/delete_table":{"post":{"tags":["Assets"],"summary":"Delete Table","operationId":"delete_table_api_delete_table_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_delete_table_api_delete_table_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/suggest":{"post":{"tags":["Assets"],"summary":"Suggest","operationId":"suggest_api_suggest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_suggest_api_suggest_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/cancel_sampling":{"post":{"tags":["Assets"],"summary":"Cancel Sampling Endpoint","description":"Cancel an active processing job (descriptions + sampling).\n\nSets a cancel flag that the task checks at each checkpoint.\nAlso revokes the Celery task if running.","operationId":"cancel_sampling_endpoint_api_cancel_sampling_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_cancel_sampling_endpoint_api_cancel_sampling_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/save_table_doc":{"post":{"tags":["Assets"],"summary":"Save Table Doc","description":"endpoint to save table_doc","operationId":"save_table_doc_api_save_table_doc_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_save_table_doc_api_save_table_doc_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/asset/{token}":{"get":{"tags":["Assets"],"summary":"Get Secret Asset","operationId":"get_secret_asset_api_asset__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"download_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/session-file/{chat_id}":{"get":{"tags":["Assets"],"summary":"Serve Session File","description":"Serve files written by the agent sandbox, with auth + ownership + path validation.\n\nSecurity layers:\n1. Auth: optional, unauthenticated access allowed for public (shared) chats\n2. Org access: authenticated users must belong to the org or its parent org\n3. Chat ownership: public chats are open; private chats require ownership or admin\n4. Path: resolved inside the session, outside its picture store, an allowed extension, then\n   opened as a real file inside the session (confined_fs.open_read) and served from that handle\n5. MIME denylist: dangerous content types forced to application/octet-stream","operationId":"serve_session_file_api_session_file__chat_id__get","parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"path","in":"query","required":true,"schema":{"type":"string","description":"Relative path within the session directory","title":"Path"},"description":"Relative path within the session directory"},{"name":"org_id","in":"query","required":true,"schema":{"type":"string","description":"Organization ID that owns the chat","title":"Org Id"},"description":"Organization ID that owns the chat"},{"name":"w","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Max width for an image preview; ignored for other files","title":"W"},"description":"Max width for an image preview; ignored for other files"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/logo":{"get":{"tags":["Assets"],"summary":"Get Logo","operationId":"get_logo_api_logo_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/public/org_logo":{"get":{"tags":["Assets"],"summary":"Get Public Org Logo","description":"Unauthenticated logo fetch for the login page branding. Callers must\nidentify the org via a slug (preferred, /login/<slug>), the existing\norg_id query param flow, or implicitly via a verified custom domain in\nthe Host header. No listing — if the caller doesn't already know the\nidentifier, no logo is served.","operationId":"get_public_org_logo_api_public_org_logo_get","parameters":[{"name":"slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/org_favicon":{"get":{"tags":["Assets"],"summary":"Get Public Org Favicon","operationId":"get_public_org_favicon_api_public_org_favicon_get","parameters":[{"name":"org_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/org_favicon_preview":{"get":{"tags":["Assets"],"summary":"Get Org Favicon Preview","operationId":"get_org_favicon_preview_api_org_favicon_preview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/upload_files":{"post":{"tags":["Assets"],"summary":"Upload Files","operationId":"upload_files_api_upload_files_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_files_api_upload_files_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/list_files":{"get":{"tags":["Assets"],"summary":"List Files","operationId":"list_files_api_list_files_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/delete_file":{"delete":{"tags":["Assets"],"summary":"Delete File","operationId":"delete_file_api_delete_file_delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_delete_file_api_delete_file_delete"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/relationships":{"get":{"tags":["Assets"],"summary":"Get Relationships Route","operationId":"get_relationships_route_api_relationships_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Assets"],"summary":"Save Relationships Route","operationId":"save_relationships_route_api_relationships_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Relationship"},"title":"Relationships"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/relationships/delete":{"post":{"tags":["Assets"],"summary":"Delete Relationships Route","operationId":"delete_relationships_route_api_relationships_delete_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"type":"integer"},"title":"Relationship Ids"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/activate_table":{"post":{"tags":["Assets"],"summary":"Activate Table Route","operationId":"activate_table_route_api_activate_table_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_activate_table_route_api_activate_table_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/deactivate_table":{"post":{"tags":["Assets"],"summary":"Deactivate Table Route","operationId":"deactivate_table_route_api_deactivate_table_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_deactivate_table_route_api_deactivate_table_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scan_table":{"post":{"tags":["Assets"],"summary":"Scan Table Route","operationId":"scan_table_route_api_scan_table_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_scan_table_route_api_scan_table_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/activate_table_fast":{"post":{"tags":["Assets"],"summary":"Activate Table Fast Route","operationId":"activate_table_fast_route_api_activate_table_fast_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_activate_table_fast_route_api_activate_table_fast_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/export_history":{"get":{"tags":["Admin"],"summary":"Get all historical chat messages.","description":"Export raw user_queries rows for a date range.\n\nA row is in the range when its `start_time` (UTC) is on or after `start_date` and\nbefore `end_date`: `start_date` is included, `end_date` is not.\n\nEvery field on each row is documented under the response schema below, in\n`UserQueryRow`. Note the alias pairs: `is_scheduled` /\n`created_by_schedule` (this run was scheduled) and `has_schedule` /\n`has_active_schedule` (the parent chat has a schedule). Use `acc_actual`\nwhen present, otherwise `acc_consumed`; summed by `chat_kind`, they split\nwhat building apps cost from what questions cost.","operationId":"export_history_api_export_history_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]},{"QueryTokenAuth":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"type":"string","description":"First day included (UTC), YYYY-MM-DD. Default: 14 days before today.","title":"Start Date"},"description":"First day included (UTC), YYYY-MM-DD. Default: 14 days before today."},{"name":"end_date","in":"query","required":false,"schema":{"type":"string","description":"First day NOT included (UTC), YYYY-MM-DD: the range ends at the start of this day. Default: tomorrow, so today is included. For a single day, pass that day and the day after.","title":"End Date"},"description":"First day NOT included (UTC), YYYY-MM-DD: the range ends at the start of this day. Default: tomorrow, so today is included. For a single day, pass that day and the day after."},{"name":"include_all_workspaces","in":"query","required":false,"schema":{"type":"boolean","description":"Include history from all workspaces (main workspace only)","default":false,"title":"Include All Workspaces"},"description":"Include history from all workspaces (main workspace only)"},{"name":"include_answers","in":"query","required":false,"schema":{"type":"boolean","description":"Add `answer` to each row: the answer the user read for that question. Rows without a saved answer get null.","default":false,"title":"Include Answers"},"description":"Add `answer` to each row: the answer the user read for that question. Rows without a saved answer get null."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/export_app_views":{"get":{"tags":["Admin"],"summary":"Get who viewed each app.","description":"Export every app's views, one row per app and viewer.\n\nEvery field on each row is documented under the response schema below;\nsee `AppViewRow`. A view is one open of the app, opens by the same viewer\nwithin 15 minutes count once, and counting starts at `tracking_since`.\nOpens by Dot support staff are left out.","operationId":"export_app_views_api_export_app_views_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]},{"QueryTokenAuth":[]}],"parameters":[{"name":"include_all_workspaces","in":"query","required":false,"schema":{"type":"boolean","description":"Include app views from all workspaces (main workspace only)","default":false,"title":"Include All Workspaces"},"description":"Include app views from all workspaces (main workspace only)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportAppViewsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/chat_history_all":{"get":{"tags":["Admin"],"summary":"Chat History All","operationId":"chat_history_all_api_chat_history_all_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/chat_history_paginated":{"get":{"tags":["Admin"],"summary":"Chat History Paginated","description":"Get paginated chat history with server-side filtering and sorting.\n\nThis endpoint replaces client-side pagination for better performance.","operationId":"chat_history_paginated_api_chat_history_paginated_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (1-indexed)","default":1,"title":"Page"},"description":"Page number (1-indexed)"},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Items per page","default":20,"title":"Per Page"},"description":"Items per page"},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","pattern":"^(last_updated|date|messages|acc_consumed|credits_per_message|views)$","description":"Sort column","default":"last_updated","title":"Sort By"},"description":"Sort column"},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","description":"Sort direction","default":"desc","title":"Sort Order"},"description":"Sort direction"},{"name":"filter_type","in":"query","required":false,"schema":{"type":"string","description":"Type filter: all, agentic (Analysis), app (App building: chats that built or edited an app), context_agent (Root), proposals, scheduled (has a schedule), is_scheduled (created by a schedule), shared, training or archived","default":"all","title":"Filter Type"},"description":"Type filter: all, agentic (Analysis), app (App building: chats that built or edited an app), context_agent (Root), proposals, scheduled (has a schedule), is_scheduled (created by a schedule), shared, training or archived"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"description":"Search term","title":"Search"},"description":"Search term"},{"name":"labels","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated label names","title":"Labels"},"description":"Comma-separated label names"},{"name":"users","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated user display names","title":"Users"},"description":"Comma-separated user display names"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"description":"First day (YYYY-MM-DD) of last activity, included, in `tz`","title":"Start Date"},"description":"First day (YYYY-MM-DD) of last activity, included, in `tz`"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"description":"Last day (YYYY-MM-DD) of last activity, included, in `tz`","title":"End Date"},"description":"Last day (YYYY-MM-DD) of last activity, included, in `tz`"},{"name":"tz","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"Viewer's IANA timezone for the date range (default UTC)","title":"Tz"},"description":"Viewer's IANA timezone for the date range (default UTC)"},{"name":"review","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(liked|disliked|issue|assumptions|success|unanswered)(,(liked|disliked|issue|assumptions|success|unanswered))*$"},{"type":"null"}],"description":"Comma-separated review outcomes; a chat matching any of them is kept","title":"Review"},"description":"Comma-separated review outcomes; a chat matching any of them is kept"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/chat_history_export":{"get":{"tags":["Admin"],"summary":"Download History as CSV.","description":"Every chat the History page shows under these filters, on all pages, as one CSV file.\n\nThe same filters, sorting and access rules as the History page: a modeler sees the chats\ntheir groups and chat access allow, private Slack and Teams channels stay masked. Dates are\nthe viewer's calendar days in `tz`, both ends included, matched on a chat's last activity.\nFor each question with its answer, use `/api/export_history?include_answers=true`.\n\nColumns, in order:\n\n- `chat_id`: the chat's ID\n- `type`: `chat`, `analysis`, `app` (the chat built or edited an app, a scheduled run's\n  included), `scheduled_run` (a run a schedule created: History's \"Created by Schedule\"),\n  `root` (a Root session), or the ticket a Root session became: `proposal`, `data_gap` or\n  `review`\n- `title`: the title History shows\n- `first_question`: the first message as History shows it: without attachment tags, and\n  without the earlier thread messages Dot reads with a question asked in a Slack thread;\n  empty for a scheduled run\n- `user_id`, `user_name`: who owns the chat (a private channel shows as `Private Channel with ID: …`)\n- `asked_by`: who asked in a shared Slack or Teams channel, as `Name <email>`\n- `channel`: where the chat ran: `web` (the Dot web app), `slack`, `teams`, `email`, `cli`,\n  `mcp`, …\n- `created_at`, `updated_at`: UTC, ISO 8601\n- `messages`: questions asked plus edits; empty for a scheduled run\n- `credits`, `credits_per_message`, `views`\n- `user_rating`: `liked` or `disliked`; `user_feedback`: what the user wrote with it\n- `auto_review`: Dot's own review of the conversation: `issue`, `success`, `unanswered` or\n  `finished`, with its reason in `auto_review_reason`\n- `assumptions`: how many answers rested on an assumption\n- `labels`: separated by `; `\n- `has_schedule`, `created_by_schedule`, `shared`, `archived`: `true` or `false`\n- `environment`: the environment the chat ran in, empty for Production\n- `ticket_status`, `summary`: for a Root ticket, where it stands and what it says.\n  `ticket_status` is `drafting`, `pending_review` (a proposal waiting for review), `reported`\n  (a data gap or review waiting for review), `completed` (merged), `rejected`, `resolved`,\n  `dismissed`, `no_changes`, `duplicate` or `error`\n- `link`: the chat's address","operationId":"chat_history_export_api_chat_history_export_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","pattern":"^(last_updated|date|messages|acc_consumed|credits_per_message|views)$","description":"Sort column","default":"last_updated","title":"Sort By"},"description":"Sort column"},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","description":"Sort direction","default":"desc","title":"Sort Order"},"description":"Sort direction"},{"name":"filter_type","in":"query","required":false,"schema":{"type":"string","description":"Type filter: all, agentic (Analysis), app (App building: chats that built or edited an app), context_agent (Root), proposals, scheduled (has a schedule), is_scheduled (created by a schedule), shared, training or archived","default":"all","title":"Filter Type"},"description":"Type filter: all, agentic (Analysis), app (App building: chats that built or edited an app), context_agent (Root), proposals, scheduled (has a schedule), is_scheduled (created by a schedule), shared, training or archived"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"description":"Search term","title":"Search"},"description":"Search term"},{"name":"labels","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated label names","title":"Labels"},"description":"Comma-separated label names"},{"name":"users","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated user display names","title":"Users"},"description":"Comma-separated user display names"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"description":"First day (YYYY-MM-DD) of last activity, included, in `tz`","title":"Start Date"},"description":"First day (YYYY-MM-DD) of last activity, included, in `tz`"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"description":"Last day (YYYY-MM-DD) of last activity, included, in `tz`","title":"End Date"},"description":"Last day (YYYY-MM-DD) of last activity, included, in `tz`"},{"name":"tz","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"Viewer's IANA timezone for the date range (default UTC)","title":"Tz"},"description":"Viewer's IANA timezone for the date range (default UTC)"},{"name":"review","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(liked|disliked|issue|assumptions|success|unanswered)(,(liked|disliked|issue|assumptions|success|unanswered))*$"},{"type":"null"}],"description":"Comma-separated review outcomes; a chat matching any of them is kept","title":"Review"},"description":"Comma-separated review outcomes; a chat matching any of them is kept"}],"responses":{"200":{"description":"CSV text, one row per chat, header first.","content":{"text/csv":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/chat_history_metadata":{"get":{"tags":["Admin"],"summary":"Chat History Metadata Endpoint","description":"Get metadata for chat history filter dropdowns.\n\nReturns aggregated counts for labels and users across all valid chats.","operationId":"chat_history_metadata_endpoint_api_chat_history_metadata_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/daily_usage":{"get":{"tags":["Admin"],"summary":"Daily Usage","operationId":"daily_usage_api_daily_usage_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"group_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group By"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"Optional ISO-8601 lower bound on start_time","title":"Since"},"description":"Optional ISO-8601 lower bound on start_time"},{"name":"tz","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"Viewer's IANA timezone for day buckets","title":"Tz"},"description":"Viewer's IANA timezone for day buckets"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/user_adoption_metrics":{"get":{"tags":["Admin"],"summary":"User Adoption Metrics","description":"Get user adoption metrics for the organization.","operationId":"user_adoption_metrics_api_user_adoption_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/users_aggregated":{"get":{"tags":["Admin"],"summary":"Get All Users Aggregated","description":"Per-user activity rollup for the History → Adoption table.","operationId":"get_all_users_aggregated_api_users_aggregated_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/update_user_adoption_target":{"post":{"tags":["Admin"],"summary":"Update User Adoption Target","description":"Update the user adoption target for the organization.","operationId":"update_user_adoption_target_api_update_user_adoption_target_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_user_adoption_target_api_update_user_adoption_target_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/rename_chat_label":{"post":{"tags":["Admin"],"summary":"Rename Chat Label","operationId":"rename_chat_label_api_rename_chat_label_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_rename_chat_label_api_rename_chat_label_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/logs/{log_id}":{"get":{"tags":["Admin"],"summary":"Stream Logs","operationId":"stream_logs_api_logs__log_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"log_id","in":"path","required":true,"schema":{"type":"string","title":"Log Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/org":{"get":{"tags":["Admin"],"summary":"Get Org Info","operationId":"get_org_info_api_org_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]},"delete":{"tags":["Admin"],"summary":"Delete Org Route","operationId":"delete_org_route_api_org_delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_delete_org_route_api_org_delete"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/feature_flags":{"get":{"tags":["Admin"],"summary":"Get Feature Flags","description":"Get feature flags for the current organization.\n\nReturns values (resolved for this org) and definitions (labels/descriptions\nfor rendering the admin UI).  Non-admin consumers can ignore definitions.","operationId":"get_feature_flags_api_feature_flags_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]},"put":{"tags":["Admin"],"summary":"Update Feature Flags","description":"Update feature flags for the current organization. Admin only.","operationId":"update_feature_flags_api_feature_flags_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_feature_flags_api_feature_flags_put"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_org_registration":{"post":{"tags":["Admin"],"summary":"Setorgregistration","operationId":"setOrgRegistration_api_set_org_registration_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_setOrgRegistration_api_set_org_registration_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_org_mfa":{"post":{"tags":["Admin"],"summary":"Set Org Mfa","description":"Update org-level MFA enforcement settings. All fields are optional —\nonly the keys present in the body are updated. Workspaces inherit from\ntheir parent org (set on the parent and they apply to children).\n\nAudit-logged so admins can see exactly when enforcement was tightened.","operationId":"set_org_mfa_api_set_org_mfa_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_org_mfa_api_set_org_mfa_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_disable_embedded_login":{"post":{"tags":["Admin"],"summary":"Set Disable Embedded Login","operationId":"set_disable_embedded_login_api_set_disable_embedded_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_disable_embedded_login_api_set_disable_embedded_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_disable_dot_agent_features":{"post":{"tags":["Admin"],"summary":"Set Disable Dot Agent Features","operationId":"set_disable_dot_agent_features_api_set_disable_dot_agent_features_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_disable_dot_agent_features_api_set_disable_dot_agent_features_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_price_performance_optimizer":{"post":{"tags":["Admin"],"summary":"Set Price Performance Optimizer","operationId":"set_price_performance_optimizer_api_set_price_performance_optimizer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_price_performance_optimizer_api_set_price_performance_optimizer_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_economy_ai_interfaces":{"post":{"tags":["Admin"],"summary":"Set Economy Ai Interfaces","operationId":"set_economy_ai_interfaces_api_set_economy_ai_interfaces_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_economy_ai_interfaces_api_set_economy_ai_interfaces_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_default_mode":{"post":{"tags":["Admin"],"summary":"Set Default Mode","operationId":"set_default_mode_api_set_default_mode_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_default_mode_api_set_default_mode_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_allow_user_mode_selection":{"post":{"tags":["Admin"],"summary":"Set Allow User Mode Selection","description":"Control whether members can override the company's default energy mode.","operationId":"set_allow_user_mode_selection_api_set_allow_user_mode_selection_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_allow_user_mode_selection_api_set_allow_user_mode_selection_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_app_authoring_access":{"post":{"tags":["Admin"],"summary":"Set App Authoring Access","description":"Atomically set the workspace's app availability and authoring audience.","operationId":"set_app_authoring_access_api_set_app_authoring_access_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_app_authoring_access_api_set_app_authoring_access_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_mode_group_access":{"post":{"tags":["Admin"],"summary":"Set Mode Group Access","description":"Scope energy modes to user groups: {mode: [group, ...]}, where an empty list\nor the all_users sentinel means everyone and the no_users sentinel turns the\nmode off for everyone. Replaces the whole map at once.","operationId":"set_mode_group_access_api_set_mode_group_access_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_mode_group_access_api_set_mode_group_access_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_routine_context_reviews_enabled":{"post":{"tags":["Admin"],"summary":"Set Routine Context Reviews Enabled","operationId":"set_routine_context_reviews_enabled_api_set_routine_context_reviews_enabled_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_routine_context_reviews_enabled_api_set_routine_context_reviews_enabled_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_show_context_agent_tickets_to_members":{"post":{"tags":["Admin"],"summary":"Set Show Context Agent Tickets To Members","operationId":"set_show_context_agent_tickets_to_members_api_set_show_context_agent_tickets_to_members_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_show_context_agent_tickets_to_members_api_set_show_context_agent_tickets_to_members_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_admin_ticket_emails_enabled":{"post":{"tags":["Admin"],"summary":"Set Admin Ticket Emails Enabled","operationId":"set_admin_ticket_emails_enabled_api_set_admin_ticket_emails_enabled_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_admin_ticket_emails_enabled_api_set_admin_ticket_emails_enabled_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/ticket_digest_settings":{"get":{"tags":["Admin"],"summary":"Get Ticket Digest Settings Endpoint","operationId":"get_ticket_digest_settings_endpoint_api_ticket_digest_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_ticket_digest_settings":{"post":{"tags":["Admin"],"summary":"Set Ticket Digest Settings","description":"Partial update of org[\"ticket_digest_settings\"]; a None value resets that key\nto its default. Primary caller is the context agent acting for an admin session.","operationId":"set_ticket_digest_settings_api_set_ticket_digest_settings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_ticket_digest_settings_api_set_ticket_digest_settings_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_routine_context_review_instructions":{"post":{"tags":["Admin"],"summary":"Set Routine Context Review Instructions","operationId":"set_routine_context_review_instructions_api_set_routine_context_review_instructions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_routine_context_review_instructions_api_set_routine_context_review_instructions_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_new_user_admin":{"post":{"tags":["Admin"],"summary":"Setnewuserasadmin","operationId":"setNewUserAsAdmin_api_set_new_user_admin_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_setNewUserAsAdmin_api_set_new_user_admin_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_new_user_group":{"post":{"tags":["Admin"],"summary":"Set New User Group","operationId":"set_new_user_group_api_set_new_user_group_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_new_user_group_api_set_new_user_group_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_new_table_group":{"post":{"tags":["Admin"],"summary":"Set New Table Group","description":"Which group a table added by a sync starts in; ``all_users`` means everyone.\nExisting tables keep their groups (see group_utils.default_table_groups).","operationId":"set_new_table_group_api_set_new_table_group_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_new_table_group_api_set_new_table_group_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_default_workspace":{"post":{"tags":["Admin"],"summary":"Set Default Workspace","description":"Set the default workspace for the entire organization.\n\nArgs:\n    workspace_org_id: The workspace org_id to set as default for all new users\n    confirm: Must be True to confirm the action (CSRF protection)","operationId":"set_default_workspace_api_set_default_workspace_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_default_workspace_api_set_default_workspace_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_user_default_workspace":{"post":{"tags":["Admin"],"summary":"Set User Default Workspace","description":"Set default workspace for a specific user","operationId":"set_user_default_workspace_api_set_user_default_workspace_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_user_default_workspace_api_set_user_default_workspace_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_disable_password_login":{"post":{"tags":["Admin"],"summary":"Disablepasswordlogin","operationId":"disablePasswordLogin_api_set_disable_password_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_disablePasswordLogin_api_set_disable_password_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_allow_public_links":{"post":{"tags":["Admin"],"summary":"Set Allow Public Links","operationId":"set_allow_public_links_api_set_allow_public_links_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_allow_public_links_api_set_allow_public_links_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_restrict_to_business_scope":{"post":{"tags":["Admin"],"summary":"Set Restrict To Business Scope","operationId":"set_restrict_to_business_scope_api_set_restrict_to_business_scope_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_restrict_to_business_scope_api_set_restrict_to_business_scope_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_hide_view_online_button":{"post":{"tags":["Admin"],"summary":"Set Hide View Online Button","operationId":"set_hide_view_online_button_api_set_hide_view_online_button_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_hide_view_online_button_api_set_hide_view_online_button_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_app_auto_archive_enabled":{"post":{"tags":["Admin"],"summary":"Set App Auto Archive Enabled","description":"ENG-1297: weekly maintenance archives apps nobody viewed for\n`app_auto_archive_days`. Default ON; certified apps are never touched.","operationId":"set_app_auto_archive_enabled_api_set_app_auto_archive_enabled_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_app_auto_archive_enabled_api_set_app_auto_archive_enabled_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_app_auto_archive_days":{"post":{"tags":["Admin"],"summary":"Set App Auto Archive Days","operationId":"set_app_auto_archive_days_api_set_app_auto_archive_days_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_app_auto_archive_days_api_set_app_auto_archive_days_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_sync_environments_to_git":{"post":{"tags":["Admin"],"summary":"Set Sync Environments To Git","description":"ENG-1272: when on, each durable environment's model files are mirrored to\na ``dot/env-<slug>`` branch in the connected Git repo. On by default.","operationId":"set_sync_environments_to_git_api_set_sync_environments_to_git_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_sync_environments_to_git_api_set_sync_environments_to_git_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_show_disclaimer":{"post":{"tags":["Admin"],"summary":"Set Show Disclaimer","operationId":"set_show_disclaimer_api_set_show_disclaimer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_show_disclaimer_api_set_show_disclaimer_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_shared_workspace_credit_limits":{"post":{"tags":["Admin"],"summary":"Set Shared Workspace Credit Limits","description":"ENG-1526: one weekly credit allowance across the whole workspace family.\n\nOn, this org's usage limits govern its workspaces too and a person's rolling\n7-day window spans every workspace they hold a seat in — instead of one fresh\nallowance per workspace. Settable only from the main workspace: the point of\nthe flag is that workspaces stop carrying limits of their own.","operationId":"set_shared_workspace_credit_limits_api_set_shared_workspace_credit_limits_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_shared_workspace_credit_limits_api_set_shared_workspace_credit_limits_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_user_weekly_credit_limit":{"post":{"tags":["Admin"],"summary":"Set User Weekly Credit Limit","description":"ENG-772: per-user weekly credit cap (rolling 7 days, ACC units).\n\nSet on the admin's own org record — for a workspace admin this configures\nthe workspace's limit, unless the main workspace shares its limits (ENG-1526).","operationId":"set_user_weekly_credit_limit_api_set_user_weekly_credit_limit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_user_weekly_credit_limit_api_set_user_weekly_credit_limit_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_per_message_credit_limit":{"post":{"tags":["Admin"],"summary":"Set Per Message Credit Limit","description":"ENG-1251: per-message ACC check-in — the agent pauses and asks the user\nto confirm before continuing past this many credits in a single answer.","operationId":"set_per_message_credit_limit_api_set_per_message_credit_limit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_per_message_credit_limit_api_set_per_message_credit_limit_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_credit_limit_mode":{"post":{"tags":["Admin"],"summary":"Set Credit Limit Mode","description":"ENG-1083: pick the granular weekly-limit method — 'off', 'per_user', or 'group'.\n\nStandalone-default cap stays independent (set via set_user_weekly_credit_limit).\n`group_credit_limits_enabled` is kept in sync for any legacy readers.","operationId":"set_credit_limit_mode_api_set_credit_limit_mode_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_credit_limit_mode_api_set_credit_limit_mode_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_group_credit_limits":{"post":{"tags":["Admin"],"summary":"Set Group Credit Limits","description":"ENG-1083: per-group shared weekly credit pools.\n\nSet on the admin's own org record (workspaces are independent). One pool per\ngroup, drained by all members combined; a user in several active capped groups\nis allowed while any of them has room. Switch into group mode via\nset_credit_limit_mode('group').","operationId":"set_group_credit_limits_api_set_group_credit_limits_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_group_credit_limits_api_set_group_credit_limits_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_user_credit_limit":{"post":{"tags":["Admin"],"summary":"Set User Credit Limit","description":"ENG-1083: per-user weekly override (rolling 7 days, ACC units).\n\nUsed in per_user mode. A null/0 limit clears the override so the user falls\nback to the standalone default. Keyed by lowercased email.","operationId":"set_user_credit_limit_api_set_user_credit_limit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_user_credit_limit_api_set_user_credit_limit_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/credit_limits":{"get":{"tags":["Admin"],"summary":"Get Credit Limits","description":"Unified weekly-credit config + live rolling-7-day usage (ENG-1083).\n\nPowers both the group-pool table and the per-user limit column in the users\ntable: returns the mode, standalone default, per-group shared pools with\ncombined usage, and per-user overrides with usage. Every capped row carries\nthe release schedule computed from the same events the blocked user is shown,\nso admin and user never quote different moments.","operationId":"get_credit_limits_api_credit_limits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_disclaimer_text":{"post":{"tags":["Admin"],"summary":"Set Disclaimer Text","operationId":"set_disclaimer_text_api_set_disclaimer_text_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_disclaimer_text_api_set_disclaimer_text_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_show_privacy_acknowledgment":{"post":{"tags":["Admin"],"summary":"Set Show Privacy Acknowledgment","operationId":"set_show_privacy_acknowledgment_api_set_show_privacy_acknowledgment_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_show_privacy_acknowledgment_api_set_show_privacy_acknowledgment_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_privacy_acknowledgment_text":{"post":{"tags":["Admin"],"summary":"Set Privacy Acknowledgment Text","operationId":"set_privacy_acknowledgment_text_api_set_privacy_acknowledgment_text_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_privacy_acknowledgment_text_api_set_privacy_acknowledgment_text_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_activate_new_columns":{"post":{"tags":["Admin"],"summary":"Set Activate New Columns","description":"Set whether new columns discovered during sync should be automatically activated.\n\nArgs:\n    value: True to activate new columns automatically, False to require manual activation","operationId":"set_activate_new_columns_api_set_activate_new_columns_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_activate_new_columns_api_set_activate_new_columns_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_auto_sample_enabled":{"post":{"tags":["Admin"],"summary":"Set Auto Sample Enabled","description":"Set whether Dot automatically keeps data samples fresh in the background.\n\nWhen on (default), after each connection sync Dot samples fields that have\nnever been sampled (highest-usage first) and refreshes samples older than a\nmonth — no AI descriptions, just sample values.\n\nArgs:\n    value: True to keep samples fresh automatically, False to disable","operationId":"set_auto_sample_enabled_api_set_auto_sample_enabled_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_auto_sample_enabled_api_set_auto_sample_enabled_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_chat_retention_days":{"post":{"tags":["Admin"],"summary":"Set Chat Retention Days","description":"Set the chat retention policy for the organization.\n\nChats without active schedules will be automatically deleted after the specified\nnumber of days. Set to 0 to disable auto-deletion (keep chats forever).\n\nArgs:\n    value: Number of days after which to auto-delete chats without schedules.\n           Valid values: 0 (never), 30, 90, 180, 360, 720.","operationId":"set_chat_retention_days_api_set_chat_retention_days_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_chat_retention_days_api_set_chat_retention_days_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_file_retention_days":{"post":{"tags":["Admin"],"summary":"Set File Retention Days","description":"Set the file retention policy for the organization.\n\nUploaded files in chats without active schedules or pinned status\nwill be automatically deleted after the specified number of days.\n\nArgs:\n    value: Number of days after which to auto-delete uploaded files.\n           Valid values: 7, 30, 90.","operationId":"set_file_retention_days_api_set_file_retention_days_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_file_retention_days_api_set_file_retention_days_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_allowed_email_domains":{"post":{"tags":["Admin"],"summary":"Set Allowed Email Domains","description":"Set the allowed email domains whitelist. Empty list = allow all.","operationId":"set_allowed_email_domains_api_set_allowed_email_domains_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_allowed_email_domains_api_set_allowed_email_domains_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_external_email_exempt_groups":{"post":{"tags":["Admin"],"summary":"Set External Email Exempt Groups","description":"Set the groups whose members may email outside the allowed domains.\n\nEmpty list = nobody is exempt (the restriction binds everyone). Groups are not\nchecked against existing members on purpose: an SSO group mapping legitimately\nnames a group before anyone has logged in under it.","operationId":"set_external_email_exempt_groups_api_set_external_email_exempt_groups_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_external_email_exempt_groups_api_set_external_email_exempt_groups_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/capability_flags":{"get":{"tags":["Admin"],"summary":"Get Capability Flags","description":"Return the workspace's capability flags merged with defaults.\n\nReadable by any authenticated user so the frontend can gate UI for the\ncurrent viewer (modeler hides Skills tab, end users see consent checkbox,\netc). Only admins can modify via POST /set_capability_flag.","operationId":"get_capability_flags_api_capability_flags_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_capability_flag":{"post":{"tags":["Admin"],"summary":"Set Capability Flag","description":"Toggle a single capability flag for the current workspace.\n\nAtomic json_set UPDATE so concurrent admin toggles of different flags\non the same org don't clobber each other.","operationId":"set_capability_flag_api_set_capability_flag_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_capability_flag_api_set_capability_flag_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/get_users":{"get":{"tags":["Admin"],"summary":"Get All Users","operationId":"get_all_users_api_get_users_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/get_user_groups":{"get":{"tags":["Admin"],"summary":"Get All User Groups","operationId":"get_all_user_groups_api_get_user_groups_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/send_invitations":{"post":{"tags":["Admin"],"summary":"Sendinvitations","description":"Invite users by email, classifying every address by its real outcome.\n\n``suppressed`` is distinct from ``sent``/``resent``: an admin must never be\ntold delivery happened when a recipient or global mail cap prevented it.","operationId":"sendInvitations_api_send_invitations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_sendInvitations_api_send_invitations_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/create_user":{"post":{"tags":["Admin"],"summary":"Create User Route","operationId":"create_user_route_api_create_user_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_create_user_route_api_create_user_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/delete_user":{"post":{"tags":["Admin"],"summary":"Delete User Route","operationId":"delete_user_route_api_delete_user_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_delete_user_route_api_delete_user_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/tokens":{"post":{"tags":["Admin"],"summary":"Create Token","description":"Create a new API token for a user.\n\nRequest body:\n- user_id: ID of the user to create token for\n- name: Name of the token\n- expires_in_days: Optional number of days until token expires\n- description: Optional description","operationId":"create_token_api_tokens_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_create_token_api_tokens_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Admin"],"summary":"List Tokens","description":"List all API tokens for a user.\n\nQuery parameters:\n- user_id: Optional user ID to get tokens for (if omitted, uses the current admin user)","operationId":"list_tokens_api_tokens_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tokens/{token_id}":{"delete":{"tags":["Admin"],"summary":"Revoke Token","description":"Revoke an API token.\n\nPath parameters:\n- token_id: ID of the token to revoke\n\nQuery parameters:\n- user_id: Optional user ID the token belongs to (if omitted, uses the current admin user)","operationId":"revoke_token_api_tokens__token_id__delete","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"string","title":"Token Id"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"delete","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Delete"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/change_user_role":{"post":{"tags":["Admin"],"summary":"Change User Role","operationId":"change_user_role_api_change_user_role_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_change_user_role_api_change_user_role_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/add_user_to_group":{"post":{"tags":["Admin"],"summary":"Add User To Group","operationId":"add_user_to_group_api_add_user_to_group_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_add_user_to_group_api_add_user_to_group_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/remove_user_from_group":{"post":{"tags":["Admin"],"summary":"Remove User From Group","operationId":"remove_user_from_group_api_remove_user_from_group_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_remove_user_from_group_api_remove_user_from_group_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/add_doc_to_group":{"post":{"tags":["Admin"],"summary":"Add Doc To Group","operationId":"add_doc_to_group_api_add_doc_to_group_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_add_doc_to_group_api_add_doc_to_group_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/remove_doc_from_group":{"post":{"tags":["Admin"],"summary":"Remove Doc From Group","operationId":"remove_doc_from_group_api_remove_doc_from_group_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_remove_doc_from_group_api_remove_doc_from_group_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/get_groups":{"get":{"tags":["Admin"],"summary":"Get All Groups","operationId":"get_all_groups_api_get_groups_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/save_sso":{"post":{"tags":["Admin"],"summary":"Save Sso","operationId":"save_sso_api_save_sso_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_save_sso_api_save_sso_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/remove_sso":{"post":{"tags":["Admin"],"summary":"Remove Sso","operationId":"remove_sso_api_remove_sso_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_remove_sso_api_remove_sso_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/get_azure_group_mappings":{"get":{"tags":["Admin"],"summary":"Get Azure Group Mappings","operationId":"get_azure_group_mappings_api_get_azure_group_mappings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/save_azure_group_mapping":{"post":{"tags":["Admin"],"summary":"Save Azure Group Mapping","description":"Upsert a single Azure group mapping keyed by azure_group_id.","operationId":"save_azure_group_mapping_api_save_azure_group_mapping_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_save_azure_group_mapping_api_save_azure_group_mapping_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/delete_azure_group_mapping":{"post":{"tags":["Admin"],"summary":"Delete Azure Group Mapping","operationId":"delete_azure_group_mapping_api_delete_azure_group_mapping_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_delete_azure_group_mapping_api_delete_azure_group_mapping_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_azure_allowed_tenant_ids":{"post":{"tags":["Admin"],"summary":"Set Azure Allowed Tenant Ids","operationId":"set_azure_allowed_tenant_ids_api_set_azure_allowed_tenant_ids_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_azure_allowed_tenant_ids_api_set_azure_allowed_tenant_ids_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_azure_rollout":{"post":{"tags":["Admin"],"summary":"Set Azure Rollout","description":"Set how Azure group mappings are rolled out.\n\n- \"off\":   mappings are inert (no governance).\n- \"pilot\": govern only `workspaces` — the main workspace and other workspaces\n           are untouched; users in no mapped group are left unmanaged.\n- \"full\":  Azure is authoritative over the main workspace and every\n           workspace; users in no mapped group are denied access.","operationId":"set_azure_rollout_api_set_azure_rollout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_azure_rollout_api_set_azure_rollout_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_azure_workspace_sync_mode":{"post":{"tags":["Admin"],"summary":"Set Azure Workspace Sync Mode","operationId":"set_azure_workspace_sync_mode_api_set_azure_workspace_sync_mode_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_azure_workspace_sync_mode_api_set_azure_workspace_sync_mode_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_user_azure_managed":{"post":{"tags":["Admin"],"summary":"Set User Azure Managed","description":"Set (or clear) a user's azure_managed flag.\n\nPassing `null` clears the explicit flag so the user falls back to the org default.","operationId":"set_user_azure_managed_api_set_user_azure_managed_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_user_azure_managed_api_set_user_azure_managed_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/bulk_enable_azure_managed":{"post":{"tags":["Admin"],"summary":"Bulk Enable Azure Managed","description":"Set azure_managed=True on every user in the org likely to be SSO-authenticated.\n\nHeuristic: any user without a hashed_password (i.e. has never set a local\npassword) is a candidate for Azure-driven management. Admins can always\nunmanage individuals afterward.","operationId":"bulk_enable_azure_managed_api_bulk_enable_azure_managed_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/get_google_group_mappings":{"get":{"tags":["Admin"],"summary":"Get Google Group Mappings","operationId":"get_google_group_mappings_api_get_google_group_mappings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/save_google_group_mapping":{"post":{"tags":["Admin"],"summary":"Save Google Group Mapping","description":"Upsert a single Google group mapping keyed by google_group_id (group email).","operationId":"save_google_group_mapping_api_save_google_group_mapping_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_save_google_group_mapping_api_save_google_group_mapping_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/delete_google_group_mapping":{"post":{"tags":["Admin"],"summary":"Delete Google Group Mapping","operationId":"delete_google_group_mapping_api_delete_google_group_mapping_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_delete_google_group_mapping_api_delete_google_group_mapping_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_google_rollout":{"post":{"tags":["Admin"],"summary":"Set Google Rollout","description":"Set how Google group mappings are rolled out ('off' | 'pilot' | 'full').","operationId":"set_google_rollout_api_set_google_rollout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_google_rollout_api_set_google_rollout_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_google_workspace_sync_mode":{"post":{"tags":["Admin"],"summary":"Set Google Workspace Sync Mode","operationId":"set_google_workspace_sync_mode_api_set_google_workspace_sync_mode_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_google_workspace_sync_mode_api_set_google_workspace_sync_mode_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_user_google_managed":{"post":{"tags":["Admin"],"summary":"Set User Google Managed","description":"Set (or clear) a user's google_managed flag (break-glass exemption).","operationId":"set_user_google_managed_api_set_user_google_managed_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_user_google_managed_api_set_user_google_managed_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_okta_group_sync":{"post":{"tags":["Admin"],"summary":"Set Okta Group Sync","description":"Turn Okta group mirroring on or off for the org.\n\nDeliberately a single flag: Okta group names are used verbatim as Dot group\nnames, so there is nothing to map. Which groups reach Dot is controlled in\nOkta, by the groups claim filter on the Dot app.","operationId":"set_okta_group_sync_api_set_okta_group_sync_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_okta_group_sync_api_set_okta_group_sync_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/org_notes":{"post":{"tags":["Admin"],"summary":"Create Org Note","description":"Create a note, at the top level unless ``parent_id`` names its parent. With ?training_id=,\nwrites into the training's branch.","operationId":"create_org_note_api_org_notes_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_create_org_note_api_org_notes_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Admin"],"summary":"Get All Org Notes","operationId":"get_all_org_notes_api_org_notes_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"active_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Active Only"}},{"name":"training_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/org_notes_budget":{"get":{"tags":["Admin"],"summary":"Get Foundational Notes Budget","operationId":"get_foundational_notes_budget_api_org_notes_budget_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/org_notes/{note_id}":{"get":{"tags":["Admin"],"summary":"Get Single Org Note","operationId":"get_single_org_note_api_org_notes__note_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}},{"name":"training_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Id"}},{"name":"version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Admin"],"summary":"Update Org Note","description":"Save a note. A body without ``parent_id`` keeps the note's parent; null moves the note to\nthe top level. ``base_blob_sha`` is the version the editor opened: a note changed since\nis merged with this edit, and an edit that overlaps the change answers 409\n``note_edit_conflict``. ``base_active`` is whether it was active then: a save that keeps\nthat leaves an archive or restore made since in place. Without them the note is written as sent.","operationId":"update_org_note_api_org_notes__note_id__put","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}},{"name":"training_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_NoteSaveBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Delete Note","operationId":"delete_note_api_org_notes__note_id__delete","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}},{"name":"training_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/note_templates":{"get":{"tags":["Admin"],"summary":"Get Note Templates","description":"Get all note templates for the current organization.","operationId":"get_note_templates_api_note_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]},"post":{"tags":["Admin"],"summary":"Create Note Template","description":"Create a new note template.","operationId":"create_note_template_api_note_templates_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_create_note_template_api_note_templates_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/note_templates/{template_id}":{"put":{"tags":["Admin"],"summary":"Update Note Template","description":"Update an existing note template.","operationId":"update_note_template_api_note_templates__template_id__put","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_note_template_api_note_templates__template_id__put"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Delete Note Template","description":"Delete a note template.","operationId":"delete_note_template_api_note_templates__template_id__delete","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/save_color_palette":{"post":{"tags":["Admin"],"summary":"Save Color Palette","operationId":"save_color_palette_api_save_color_palette_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_save_color_palette_api_save_color_palette_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/find_company_palette":{"post":{"tags":["Admin"],"summary":"Find Company Palette","operationId":"find_company_palette_api_find_company_palette_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_find_company_palette_api_find_company_palette_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/save_branding":{"post":{"tags":["Admin"],"summary":"Save Branding","operationId":"save_branding_api_save_branding_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_save_branding_api_save_branding_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/upload_logo":{"post":{"tags":["Admin"],"summary":"Upload Logo","operationId":"upload_logo_api_upload_logo_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_logo_api_upload_logo_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/reset_logo":{"post":{"tags":["Admin"],"summary":"Reset Logo","operationId":"reset_logo_api_reset_logo_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_reset_logo_api_reset_logo_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/ppt_templates":{"get":{"tags":["Admin"],"summary":"Get Ppt Templates","description":"Production's PowerPoint templates, as the model repo's presentations/ folder holds them.","operationId":"get_ppt_templates_api_ppt_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/download_ppt_template":{"get":{"tags":["Admin"],"summary":"Download Ppt Template","description":"The template file as the repository holds it, under its file name.","operationId":"download_ppt_template_api_download_ppt_template_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_id","in":"query","required":true,"schema":{"type":"string","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/upload_ppt_template":{"post":{"tags":["Admin"],"summary":"Upload Ppt Template","description":"Add a PowerPoint template to production's presentations/ folder.\n\n- Max file size: 25MB\n- Only .pptx or .potx files that open as a presentation","operationId":"upload_ppt_template_api_upload_ppt_template_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_ppt_template_api_upload_ppt_template_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/update_ppt_template":{"post":{"tags":["Admin"],"summary":"Update Ppt Template","description":"Rename a template, set its usage guidelines, scope it to groups, or make it the default.","operationId":"update_ppt_template_api_update_ppt_template_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_ppt_template_api_update_ppt_template_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/delete_ppt_template":{"post":{"tags":["Admin"],"summary":"Delete Ppt Template","description":"Delete a template. Requires confirm=True as defense-in-depth.","operationId":"delete_ppt_template_api_delete_ppt_template_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_delete_ppt_template_api_delete_ppt_template_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/unblock_element":{"post":{"tags":["Admin"],"summary":"Unblock Doc","operationId":"unblock_doc_api_unblock_element_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_unblock_doc_api_unblock_element_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/take_over_element":{"post":{"tags":["Admin"],"summary":"Take Over Doc","operationId":"take_over_doc_api_take_over_element_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_take_over_doc_api_take_over_element_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/git_commits":{"get":{"tags":["Admin"],"summary":"Git Commits","operationId":"git_commits_api_git_commits_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"doc_id","in":"query","required":false,"schema":{"type":"string","title":"Doc Id"}},{"name":"commit_id","in":"query","required":false,"schema":{"type":"string","title":"Commit Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/git_commit_changes":{"get":{"tags":["Admin"],"summary":"Git Commit Changes","operationId":"git_commit_changes_api_git_commit_changes_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"commit_id","in":"query","required":true,"schema":{"type":"string","title":"Commit Id"}},{"name":"doc_id","in":"query","required":false,"schema":{"type":"string","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/revert_to_commit":{"post":{"tags":["Admin"],"summary":"Revert To Commit","description":"Restore the workspace's version-controlled docs to a previous commit.\n\nDestructive: requires explicit confirmation. Creates a new revert commit\n(history-preserving) and reconciles the internal DB from the filesystem.","operationId":"revert_to_commit_api_revert_to_commit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_revert_to_commit_api_revert_to_commit_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/change_model":{"post":{"tags":["Admin"],"summary":"Change Model","operationId":"change_model_api_change_model_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_change_model_api_change_model_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/save_modules":{"post":{"tags":["Admin"],"summary":"Save Modules","operationId":"save_modules_api_save_modules_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_save_modules_api_save_modules_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/create_workspace":{"post":{"tags":["Admin"],"summary":"Create Workspace","description":"Create a new workspace for the current organization.\n\nWorkspaces are implemented as separate organizations with IDs following the pattern:\n{original_org_id}-w-{workspace_name}\n\nThe workspace organization has:\n- is_workspace: true\n- parent_org_id: original organization ID\n\nUsers access workspaces through their membership in the parent organization.\nOnly admin users can create workspaces.","operationId":"create_workspace_api_create_workspace_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_create_workspace_api_create_workspace_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/add_user_to_workspace":{"post":{"tags":["Admin"],"summary":"Add User To Workspace","description":"Add a user from the parent organization to a workspace.\nFor the main workspace, this switches user access from workspaces_only to full.\nFor regular workspaces, this creates a compound user ID for the workspace.\nOnly organization admins or workspace admins can add users.","operationId":"add_user_to_workspace_api_add_user_to_workspace_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_add_user_to_workspace_api_add_user_to_workspace_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/list_all_workspaces":{"get":{"tags":["Admin"],"summary":"List All Workspaces","description":"List the organization's workspaces with their members (admin only).\nA base-org admin sees the main workspace and every workspace; a workspace admin\nsees only the workspaces they hold an admin seat in.","operationId":"list_all_workspaces_api_list_all_workspaces_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/list_workspace_users":{"get":{"tags":["Admin"],"summary":"List Workspace Users","description":"List all users in a specific workspace.\nAccessible by organization admins or workspace admins.","operationId":"list_workspace_users_api_list_workspace_users_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"workspace_name","in":"query","required":true,"schema":{"type":"string","description":"Name of the workspace","title":"Workspace Name"},"description":"Name of the workspace"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/remove_user_from_workspace":{"post":{"tags":["Admin"],"summary":"Remove User From Workspace","description":"Remove a user from a workspace.\nFor the main workspace, this switches user access from full to workspaces_only.\nFor regular workspaces, this removes the user from the workspace.\nOnly organization admins or workspace admins can remove users.","operationId":"remove_user_from_workspace_api_remove_user_from_workspace_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_remove_user_from_workspace_api_remove_user_from_workspace_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/update_workspace_user_role":{"post":{"tags":["Admin"],"summary":"Update Workspace User Role","description":"Update a user's role in a workspace.\nOnly organization admins or workspace admins can update user roles.","operationId":"update_workspace_user_role_api_update_workspace_user_role_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_workspace_user_role_api_update_workspace_user_role_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/organization_users":{"get":{"tags":["Admin"],"summary":"Get Organization Users","description":"Get all users in the current organization.\nUsed for populating user selection dropdowns in admin UI.\nRestricted to admin users only.","operationId":"get_organization_users_api_organization_users_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/delete_workspace":{"delete":{"tags":["Admin"],"summary":"Delete Workspace Route","description":"Delete a workspace completely, including all files, folders, databases, and git data.\n\nThis is a destructive operation that cannot be undone.\nOnly organization admins can delete workspaces.","operationId":"delete_workspace_route_api_delete_workspace_delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_delete_workspace_route_api_delete_workspace_delete"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/set_workspace_display_name":{"post":{"tags":["Admin"],"summary":"Set Workspace Display Name","description":"Set or clear a workspace's mutable display name. The internal workspace_name\n(and therefore org_id, file paths, user ids) is never affected.\nOnly organization admins or the specific workspace's admin can rename it.","operationId":"set_workspace_display_name_api_set_workspace_display_name_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_workspace_display_name_api_set_workspace_display_name_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/audit_events":{"get":{"tags":["Audit"],"summary":"List Audit Events","description":"Return audit events for the caller's org, newest first.\n\nEnterprise plan only. Admin only (enforced by `get_current_admin_user`).\nPaginate by passing `before_id=<last row's id>` from the previous page.","operationId":"list_audit_events_api_audit_events_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by event type (e.g. auth.login.success)","title":"Event Type"},"description":"Filter by event type (e.g. auth.login.success)"},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 start timestamp (inclusive)","title":"Start"},"description":"ISO 8601 start timestamp (inclusive)"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 end timestamp (inclusive)","title":"End"},"description":"ISO 8601 end timestamp (inclusive)"},{"name":"before_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Cursor: return events with id < this","title":"Before Id"},"description":"Cursor: return events with id < this"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/save_slack_team_id":{"post":{"tags":["Integrations"],"summary":"Save Slack Team Id","operationId":"save_slack_team_id_api_save_slack_team_id_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_save_slack_team_id_api_save_slack_team_id_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/slack/events":{"post":{"tags":["Integrations"],"summary":"Endpoint","operationId":"endpoint_slack_events_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/slack/install":{"get":{"tags":["Integrations"],"summary":"Install","operationId":"install_slack_install_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/slack/oauth_redirect":{"get":{"tags":["Integrations"],"summary":"Oauth Redirect","operationId":"oauth_redirect_slack_oauth_redirect_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/slack/events_emerge":{"post":{"tags":["Integrations"],"summary":"Endpoint Emerge","operationId":"endpoint_emerge_slack_events_emerge_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/slack/install_emerge":{"get":{"tags":["Integrations"],"summary":"Install Emerge","operationId":"install_emerge_slack_install_emerge_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/slack/oauth_redirect_emerge":{"get":{"tags":["Integrations"],"summary":"Oauth Redirect Emerge","operationId":"oauth_redirect_emerge_slack_oauth_redirect_emerge_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/save_teams_tenant_id":{"post":{"tags":["Integrations"],"summary":"Save Teams Tenant Id","operationId":"save_teams_tenant_id_api_save_teams_tenant_id_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_save_teams_tenant_id_api_save_teams_tenant_id_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/validate_teams_recipient":{"post":{"tags":["Integrations"],"summary":"Validate Teams Recipient","description":"Validate that a Teams recipient can receive scheduled messages.\n\nChecks:\n1. Recipient exists in discovered entities or conversation references\n2. For users: Bot is installed (attempts conversation creation)\n3. Returns validation result with user-friendly error message","operationId":"validate_teams_recipient_api_validate_teams_recipient_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_validate_teams_recipient_api_validate_teams_recipient_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/save_smtp_settings":{"post":{"tags":["Integrations"],"summary":"Save Smtp Settings","operationId":"save_smtp_settings_api_save_smtp_settings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_save_smtp_settings_api_save_smtp_settings_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/test_smtp_settings":{"post":{"tags":["Integrations"],"summary":"Test Smtp Settings","operationId":"test_smtp_settings_api_test_smtp_settings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_test_smtp_settings_api_test_smtp_settings_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/teams/install":{"get":{"tags":["Integrations"],"summary":"Teams Install","operationId":"teams_install_api_teams_install_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/teams/messages":{"post":{"tags":["Integrations"],"summary":"Messages","operationId":"messages_api_teams_messages_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/get_slack_channels":{"get":{"tags":["Integrations"],"summary":"Get Slack Channels","description":"Slack destinations for the caller: channels the bot is in, plus — with\ninclude_dm_users — every workspace member as a DM target.","operationId":"get_slack_channels_api_get_slack_channels_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"include_dm_users","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Dm Users"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/send_message":{"post":{"tags":["Integrations"],"summary":"Send Message","description":"Send a message as Dot to Slack or email, for automations such as a scheduled script.\n\nAdmin only. Recipients stay inside what the workspace already reaches: Slack channels the\nDot bot is in, and DMs or email to workspace members (email also follows the allowed-domain\npolicy). Every recipient is resolved before anything is sent. A refusal is a 4xx whose\n`detail` is {\"code\", \"message\"}; the message says what to fix. A 502 `delivery_failed`\nlists each recipient's outcome in `detail.results`, so a retry with the same\nidempotency_key reaches only the ones that failed.","operationId":"send_message_api_send_message_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_send_message_api_send_message_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/get_teams_channels":{"get":{"tags":["Integrations"],"summary":"Get Teams Channels","description":"Get Teams channels and DMs from two sources:\n1. Conversation references (channels with actual message history)\n2. Discovered entities (all channels + members in teams where bot is installed)\n\nReturns list of dictionaries with 'id' and 'name' fields.","operationId":"get_teams_channels_api_get_teams_channels_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/save_email_bot_config":{"post":{"tags":["Integrations"],"summary":"Save Email Bot Config","description":"Configure email bot settings for organization.\nSimilar to save_slack_team_id() and save_teams_tenant_id().","operationId":"save_email_bot_config_api_save_email_bot_config_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_save_email_bot_config_api_save_email_bot_config_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/schedule_sync":{"post":{"tags":["Scheduling"],"summary":"Schedule Sync","description":"Schedules a sync for a specific connection type and ID based on user-provided cron args.\n\nParameters:\n- connection_type: The type of the connection (e.g., 'snowflake', 'bigquery').\n- connection_id: The ID of the connection\n- cron_args: The schedule for the sync (e.g., {\"hour\": 3, \"minute\": 0}).\n- user: The current authenticated admin user.","operationId":"schedule_sync_api_schedule_sync_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncJobRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/remove_job":{"post":{"tags":["Scheduling"],"summary":"Remove Job Route","operationId":"remove_job_route_api_remove_job_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_remove_job_route_api_remove_job_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/remove_sync_job":{"post":{"tags":["Scheduling"],"summary":"Remove Sync Job","operationId":"remove_sync_job_api_remove_sync_job_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_remove_sync_job_api_remove_sync_job_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/message_schedule/{chat_id}":{"get":{"tags":["Scheduling"],"summary":"Get Message Schedule","operationId":"get_message_schedule_api_message_schedule__chat_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"message_uuid","in":"query","required":false,"schema":{"type":"string","title":"Message Uuid"}},{"name":"job_id","in":"query","required":false,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/message_schedule/{chat_id}/{message_uuid}":{"get":{"tags":["Scheduling"],"summary":"Get Message Schedule","operationId":"get_message_schedule_api_message_schedule__chat_id___message_uuid__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"message_uuid","in":"path","required":true,"schema":{"type":"string","title":"Message Uuid"}},{"name":"job_id","in":"query","required":false,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/chat_schedules/{chat_id}":{"get":{"tags":["Scheduling"],"summary":"Get Chat Schedules","description":"Return all schedules for a chat, annotated with ``has_work_gate``.","operationId":"get_chat_schedules_api_chat_schedules__chat_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/message_scheduled_runs/{chat_id}/{message_uuid}":{"get":{"tags":["Scheduling"],"summary":"Get Message Scheduled Runs","description":"Return paginated run history for a single scheduled message.","operationId":"get_message_scheduled_runs_api_message_scheduled_runs__chat_id___message_uuid__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"message_uuid","in":"path","required":true,"schema":{"type":"string","title":"Message Uuid"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/add_message_job":{"post":{"tags":["Scheduling"],"summary":"Add Message Job Route","operationId":"add_message_job_route_api_add_message_job_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageJobRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/add_dashboard_job":{"post":{"tags":["Scheduling"],"summary":"Add Dashboard Job Route","description":"Schedule a recurring SQL refresh for a dashboard (app).\n\nRe-executes the dashboard's queries against the DB on the cron schedule and\nwarms the cached snapshot — no delivery. Editing the dashboard requires edit\naccess, so do scheduling it.","operationId":"add_dashboard_job_route_api_add_dashboard_job_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardJobRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/remove_dashboard_job":{"post":{"tags":["Scheduling"],"summary":"Remove Dashboard Job Route","operationId":"remove_dashboard_job_route_api_remove_dashboard_job_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardJobRemoveRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/dashboard_schedule/{app_id}":{"get":{"tags":["Scheduling"],"summary":"Get Dashboard Schedule Route","operationId":"get_dashboard_schedule_route_api_dashboard_schedule__app_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/remove_message_job":{"post":{"tags":["Scheduling"],"summary":"Remove Message Job Route","operationId":"remove_message_job_route_api_remove_message_job_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_remove_message_job_route_api_remove_message_job_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/test_schedule_gate":{"post":{"tags":["Scheduling"],"summary":"Test Schedule Gate","description":"Test a schedule's work gate against live data.","operationId":"test_schedule_gate_api_test_schedule_gate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestGateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/test_job":{"post":{"tags":["Scheduling"],"summary":"Test Job","operationId":"test_job_api_test_job_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobTestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/schedule_defs":{"get":{"summary":"List Schedule Defs Route","description":"Every schedule the caller may manage, or with ``app_id`` that app's alone.","operationId":"list_schedule_defs_route_api_schedule_defs_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Schedule Def Route","operationId":"create_schedule_def_route_api_schedule_defs_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleDefRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/schedule_defs/{schedule_id}":{"put":{"summary":"Update Schedule Def Route","operationId":"update_schedule_def_route_api_schedule_defs__schedule_id__put","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"string","title":"Schedule Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleDefRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Schedule Def Route","operationId":"delete_schedule_def_route_api_schedule_defs__schedule_id__delete","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"string","title":"Schedule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/schedule_defs/{schedule_id}/pause":{"post":{"summary":"Pause Schedule Def Route","operationId":"pause_schedule_def_route_api_schedule_defs__schedule_id__pause_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"string","title":"Schedule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/schedule_defs/{schedule_id}/resume":{"post":{"summary":"Resume Schedule Def Route","operationId":"resume_schedule_def_route_api_schedule_defs__schedule_id__resume_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"string","title":"Schedule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/schedule_defs/test":{"post":{"summary":"Test Schedule Def Route","description":"Send one delivery now using the settings on screen, saved or not.\n\nAuthorized exactly like create — app view access, and Run As still admin-only — but\nit writes nothing: no YAML in the model repo (an app publish's ``git add .`` would\nadopt a throwaway one as a real schedule), no job, no trust pin, no ledger row.","operationId":"test_schedule_def_route_api_schedule_defs_test_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleDefRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/schedule_defs/{schedule_id}/run_now":{"post":{"summary":"Run Now Schedule Def Route","operationId":"run_now_schedule_def_route_api_schedule_defs__schedule_id__run_now_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"string","title":"Schedule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/schedule_defs/alert_preview":{"post":{"summary":"Alert Preview Route","description":"Compile and try an alert condition against the app's current data —\nthe modal's honest confirm step (plain-words sentence, value now, replay).","operationId":"alert_preview_route_api_schedule_defs_alert_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertPreviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/schedule_defs/{schedule_id}/runs":{"get":{"summary":"Schedule Def Runs Route","operationId":"schedule_def_runs_route_api_schedule_defs__schedule_id__runs_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"schedule_id","in":"path","required":true,"schema":{"type":"string","title":"Schedule Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/org_schedules":{"get":{"tags":["OrgSchedules"],"summary":"Get Org Schedules","operationId":"get_org_schedules_api_org_schedules_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Per Page"}},{"name":"type_filter","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Type Filter"}},{"name":"user_filter","in":"query","required":false,"schema":{"type":"string","default":"all","title":"User Filter"}},{"name":"search","in":"query","required":false,"schema":{"type":"string","default":"","title":"Search"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","default":"next_run","title":"Sort By"}},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","default":"asc","title":"Sort Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/set_schedule_paused":{"post":{"tags":["OrgSchedules"],"summary":"Set Schedule Paused","description":"Pause or resume a schedule without deleting it.\n\nThe flag is written to the schedule's own record, not just to the running\nscheduler: the reconcilers rebuild the jobstore from those records on every\nboot, so a pause that lived only in memory would come back on the next deploy.\n\nAuthorization piggybacks on visibility - you may pause exactly the schedules\nthe overview shows you - so someone else's schedule and a nonexistent one are\nboth a 404.","operationId":"set_schedule_paused_api_set_schedule_paused_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_schedule_paused_api_set_schedule_paused_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/org_schedule_runs":{"get":{"tags":["OrgSchedules"],"summary":"Get Org Schedule Runs","operationId":"get_org_schedule_runs_api_org_schedule_runs_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Per Page"}},{"name":"status_filter","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Status Filter"}},{"name":"user_filter","in":"query","required":false,"schema":{"type":"string","default":"all","title":"User Filter"}},{"name":"search","in":"query","required":false,"schema":{"type":"string","default":"","title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/org_schedules_count":{"get":{"tags":["OrgSchedules"],"summary":"Get Org Schedules Count","description":"Lightweight endpoint that returns only the count of active schedules.","operationId":"get_org_schedules_count_api_org_schedules_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/create_subscription_session":{"get":{"tags":["Billing"],"summary":"Create Subscription Session","operationId":"create_subscription_session_api_create_subscription_session_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"plan","in":"query","required":false,"schema":{"type":"string","description":"Plan tier: pro or team","default":"pro","title":"Plan"},"description":"Plan tier: pro or team"},{"name":"interval","in":"query","required":false,"schema":{"type":"string","description":"Billing interval: monthly or annual","default":"monthly","title":"Interval"},"description":"Billing interval: monthly or annual"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/create_customer_portal_session":{"get":{"tags":["Billing"],"summary":"Create Customer Portal Session","operationId":"create_customer_portal_session_api_create_customer_portal_session_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/my_credit_usage":{"get":{"tags":["Billing"],"summary":"My Credit Usage","description":"The requesting user's rolling-7-day weekly-cap status (banner + out-of-credits popup).\n\nOpen to any authenticated user — it only ever reveals the caller's own limit\nand usage (or their group pool's), never org billing data. Plain `def` on\npurpose: the DuckDB open can block on the usage-writer lock, so FastAPI must\nrun it in the threadpool, not on the event loop. Deliberately NOT scoped by\nthe active_groups query param axios injects: the stream/ask enforcement paths\ncheck against the user's full groups, and the display must match what blocks.","operationId":"my_credit_usage_api_my_credit_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/get_subscription_status":{"get":{"tags":["Billing"],"summary":"Get Subscription Status","description":"Get subscription status including plan tier, credit balance, and pricing info.\n\nThis is intentionally a synchronous route: Stripe's Python client is\nblocking, and an org can require several customer/subscription lookups.\nFastAPI therefore runs the function in its worker threadpool instead of\nfreezing unrelated auth, App stream, and UI requests on the event loop.","operationId":"get_subscription_status_api_get_subscription_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/billing/overage_settings":{"post":{"tags":["Billing"],"summary":"Update Overage Settings","description":"Allow billing admin to enable/disable overage and set spending cap.","operationId":"update_overage_settings_api_billing_overage_settings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_overage_settings_api_billing_overage_settings_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/billing/webhook":{"post":{"tags":["Billing Webhooks"],"summary":"Stripe Webhook","description":"Handle incoming Stripe webhook events.","operationId":"stripe_webhook_api_billing_webhook_post","parameters":[{"name":"Stripe-Signature","in":"header","required":false,"schema":{"type":"string","title":"Stripe-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/aws_marketplace/fulfillment":{"post":{"tags":["AWS Marketplace"],"summary":"Fulfillment","description":"AWS Marketplace redirects customers here after subscribing.\n\nReceives x-amzn-marketplace-token via POST form data.\nResolves the customer via AWS API, stores data in cache,\nand redirects to the frontend registration page.","operationId":"fulfillment_api_aws_marketplace_fulfillment_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/aws_marketplace/token_info":{"get":{"tags":["AWS Marketplace"],"summary":"Token Info","description":"Validate a registration token and return plan info for the frontend.\n\nSupports two token types:\n- Registration token (hex string from diskcache) — from direct fulfillment\n- Cross-region JWT (contains dots) — from transfer_token redirect","operationId":"token_info_api_aws_marketplace_token_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"}}}}}}},"/api/aws_marketplace/register":{"post":{"tags":["AWS Marketplace"],"summary":"Register","description":"Create a new user and org provisioned via AWS Marketplace.\n\nThe user skips email verification since they authenticated via AWS.","operationId":"register_api_aws_marketplace_register_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/aws_marketplace/link":{"post":{"tags":["AWS Marketplace"],"summary":"Link","description":"Link an AWS Marketplace subscription to an existing org.\n\nRequires the user to be authenticated (cookie auth) plus a valid\nregistration token from the fulfillment flow.","operationId":"link_api_aws_marketplace_link_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/aws_marketplace/transfer_token":{"post":{"tags":["AWS Marketplace"],"summary":"Transfer Token","description":"Exchange a diskcache registration token for a signed JWT.\n\nUsed when the customer selects EU region — the JWT can be verified\nby the EU instance using the shared SECRET_KEY.","operationId":"transfer_token_api_aws_marketplace_transfer_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/aws_marketplace/sns":{"post":{"tags":["AWS Marketplace"],"summary":"Sns Webhook","description":"Handle AWS Marketplace lifecycle events (Concurrent Agreements standard).\n\nEventBridge (source aws.agreement-marketplace, us-east-1 default bus)\npublishes to our SNS topic, which delivers here over HTTPS. The SNS\nMessage field carries the EventBridge event JSON.\n\nEvents:\n- SubscriptionConfirmation — auto-confirm the SNS subscription\n- License Updated - Manufacturer — purchase/renewal/change, refresh entitlements\n- License Deprovisioned - Manufacturer — cancellation/expiry, downgrade to Free","operationId":"sns_webhook_api_aws_marketplace_sns_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/healthcheck":{"get":{"tags":["Miscellaneous"],"summary":"Healthcheck","operationId":"healthcheck_api_healthcheck_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/survey":{"post":{"tags":["Miscellaneous"],"summary":"Submit Survey","operationId":"submit_survey_api_survey_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SurveyResponse"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/public/org_settings":{"get":{"tags":["Miscellaneous"],"summary":"Get Public Org Settings","description":"Get organization public settings without authentication.\nCurrently only returns the allow_public_links setting.\nThis is used by the frontend to determine if a user needs to be logged in to access shared links.\n\nQuery parameters:\n- org_id: The organization ID to get settings for","operationId":"get_public_org_settings_api_public_org_settings_get","parameters":[{"name":"org_id","in":"query","required":false,"schema":{"type":"string","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/org_details":{"get":{"tags":["Miscellaneous"],"summary":"Get Public Org Details","description":"Get organization details needed for login page without authentication.\nReturns SSO configuration to show appropriate login buttons.\n\nQuery parameters:\n- org_id: The organization ID to get details for\n- slug: The /login/sso/<slug> segment — equivalent to the org_id itself.\nWithout parameters, resolves the org by the request's Host header when it\nis a verified custom domain (login page auto-branding on dot.customer.com).","operationId":"get_public_org_details_api_public_org_details_get","parameters":[{"name":"org_id","in":"query","required":false,"schema":{"type":"string","title":"Org Id"}},{"name":"slug","in":"query","required":false,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/config":{"get":{"tags":["Miscellaneous"],"summary":"Get Public Config","description":"Get public configuration without authentication.\nReturns the default organization ID if configured (for SSO-only self-hosted instances).\nAlso returns context_agent_disabled flag to control UI visibility.","operationId":"get_public_config_api_public_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/custom_domain":{"get":{"tags":["Custom Domain"],"summary":"Get Custom Domain Status","operationId":"get_custom_domain_status_api_custom_domain_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/custom_domain/set":{"post":{"tags":["Custom Domain"],"summary":"Set Custom Domain","operationId":"set_custom_domain_api_custom_domain_set_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_custom_domain_api_custom_domain_set_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/custom_domain/verify":{"post":{"tags":["Custom Domain"],"summary":"Verify Custom Domain","operationId":"verify_custom_domain_api_custom_domain_verify_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/custom_domain/remove":{"post":{"tags":["Custom Domain"],"summary":"Remove Custom Domain","operationId":"remove_custom_domain_api_custom_domain_remove_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/custom_domain/ask":{"get":{"tags":["Custom Domain"],"summary":"Ask Custom Domain","description":"TLS issuance gate for the ingress (Caddy on_demand_tls ask).\n\n200 = this hostname is the verified custom domain of an entitled org, issue\na certificate; 404 = refuse. Must stay unauthenticated and cheap, and fail\nclosed: garbage SNI is rejected before any DB work, errors refuse issuance.","operationId":"ask_custom_domain_api_custom_domain_ask_get","parameters":[{"name":"domain","in":"query","required":false,"schema":{"type":"string","default":"","title":"Domain"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scheduled_scripts":{"get":{"tags":["ScheduledScripts"],"summary":"List Scheduled Scripts","description":"Every script directory on main, with what production knows about it.","operationId":"list_scheduled_scripts_api_scheduled_scripts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/scheduled_scripts/{slug}":{"get":{"tags":["ScheduledScripts"],"summary":"Get Scheduled Script","description":"One script in full: its definition, source, state and recent runs.","operationId":"get_scheduled_script_api_scheduled_scripts__slug__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["ScheduledScripts"],"summary":"Delete Scheduled Script","description":"Remove the script from production, with its secrets, ledger, state\nfolder and job. Refused while it runs: the run would write the folder back.","operationId":"delete_scheduled_script_api_scheduled_scripts__slug__delete","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scheduled_scripts/{slug}/confirm":{"post":{"tags":["ScheduledScripts"],"summary":"Confirm Scheduled Script","description":"Approve the exact contents of a script and schedule it as this admin.\n\nA Context Agent confirms straight from the draft it wrote and tested: the\ndirectory is published onto main first, so write → test → register is one\nturn. The draft keeps its copy, so the eventual merge is a no-op — and a\nlater edit that merges without a confirm breaks the pin.","operationId":"confirm_scheduled_script_api_scheduled_scripts__slug__confirm_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scheduled_scripts/{slug}/secrets":{"put":{"tags":["ScheduledScripts"],"summary":"Set Scheduled Script Secrets","description":"Store secret values by name; an empty value deletes one. No definition is\nrequired — a script is often drafted secrets-first.","operationId":"set_scheduled_script_secrets_api_scheduled_scripts__slug__secrets_put","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scheduled_scripts/{slug}/run":{"post":{"tags":["ScheduledScripts"],"summary":"Run Scheduled Script Now","description":"Queue one run now, bypassing pause and suspension but never the pin.\n\nThe ledger row this run leaves carries the returned ``run_id`` — also when it\nnever starts because another run of the script is still going — so a caller\nverifying new code waits for that row, not for whichever run finishes next.","operationId":"run_scheduled_script_now_api_scheduled_scripts__slug__run_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/scheduled_scripts/{slug}/state":{"delete":{"tags":["ScheduledScripts"],"summary":"Reset Scheduled Script State","description":"Empty the script's state folder, so its next run starts from the defaults\nin its own code. Refused while a run is going: the run owns the folder.","operationId":"reset_scheduled_script_state_api_scheduled_scripts__slug__state_delete","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context_pipelines":{"get":{"tags":["ContextPipelines"],"summary":"List Context Pipelines","operationId":"list_context_pipelines_api_context_pipelines_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/context_pipelines/{pipeline_id}":{"get":{"tags":["ContextPipelines"],"summary":"Get Context Pipeline","operationId":"get_context_pipeline_api_context_pipelines__pipeline_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"string","title":"Pipeline Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["ContextPipelines"],"summary":"Write Context Pipeline","description":"Write a generated draft. Existing schedule confirmation approves it separately.","operationId":"write_context_pipeline_api_context_pipelines__pipeline_id__put","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"string","title":"Pipeline Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context_pipelines/{pipeline_id}/publish":{"post":{"tags":["ContextPipelines"],"summary":"Publish Context Pipeline","description":"Only an admitted scheduled run's one-use capability grants publication.","operationId":"publish_context_pipeline_api_context_pipelines__pipeline_id__publish_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"string","title":"Pipeline Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context_pipelines/{pipeline_id}/retire":{"post":{"tags":["ContextPipelines"],"summary":"Retire Context Pipeline","operationId":"retire_context_pipeline_api_context_pipelines__pipeline_id__retire_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"string","title":"Pipeline Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/confluence_cli":{"post":{"tags":["Confluence"],"summary":"Confluence Cli","operationId":"confluence_cli_api_confluence_cli_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_confluence_cli_api_confluence_cli_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/skills":{"get":{"tags":["Skills"],"summary":"Get Skills","description":"List all skills: product (read-only) + org (editable by admins).","operationId":"get_skills_api_skills_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]},"post":{"tags":["Skills"],"summary":"Save Skill","description":"Create or update an org skill. Writes SKILL.md to data/{org_id}/model/main/skills/{name}/.","operationId":"save_skill_api_skills_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_save_skill_api_skills_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/skills/connector/{skill_name}/active":{"post":{"tags":["Skills"],"summary":"Set Connector Skill Active","description":"Enable or disable a connector skill for this org.\n\nKeyed by skill name (e.g. ``confluence``, ``jira``, ``looker``) — NOT\nconnector type. Two skills can share a connector type (confluence + jira\nboth use the ``atlassian`` connection) and must toggle independently.","operationId":"set_connector_skill_active_api_skills_connector__skill_name__active_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skill_name","in":"path","required":true,"schema":{"type":"string","title":"Skill Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_connector_skill_active_api_skills_connector__skill_name__active_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/connector/{skill_name}/permissions":{"get":{"tags":["Skills"],"summary":"Get Connector Skill Permissions","description":"Return the per-permission table for a connector skill, with the org's\ncurrent overrides applied. Powers the per-permission group picker under\neach connector skill's master enable/disable switch in the Skills UI.\n\nResponse shape per permission:\n    - ``default``: bool — the skill.md frontmatter default (on/off)\n    - ``current``: list[str] — group list governing the action today\n      (``[]`` = off, ``[\"all_users\"]`` = everyone, otherwise restricted)\n\nLegacy bool overrides stored on the org are normalized to list form on\nread; the persisted record is not rewritten until the admin actually\nedits a permission, so loads never churn ``dota.db``.","operationId":"get_connector_skill_permissions_api_skills_connector__skill_name__permissions_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skill_name","in":"path","required":true,"schema":{"type":"string","title":"Skill Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Skills"],"summary":"Update Connector Skill Permissions","description":"Update permission overrides for a connector skill.\n\nBody: ``{\"permissions\": {\"<key>\": list[str], ...}}``. Partial — only the\nkeys included are applied. Group lists are stored verbatim with the\ncanonical conventions:\n\n- ``[]``                → action disabled\n- ``[\"all_users\"]``     → action enabled for everyone\n- ``[\"g1\", \"g2\", ...]`` → restricted to users in any of these groups\n\nStorage compaction unchanged: an override that matches the (list-form)\nskill.md default removes the entry, and a skill with no remaining\noverrides is dropped from the org record entirely.","operationId":"update_connector_skill_permissions_api_skills_connector__skill_name__permissions_patch","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skill_name","in":"path","required":true,"schema":{"type":"string","title":"Skill Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_connector_skill_permissions_api_skills_connector__skill_name__permissions_patch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/connector/{skill_name}/groups":{"get":{"tags":["Skills"],"summary":"Get Connector Skill Scope","description":"Return the per-skill group scope.\n\nResponse: ``{\"skill\": str, \"scope\": list[str] | None, \"default\": [\"all_users\"]}``\nwhere ``scope`` is the persisted group list (``[]`` = off, ``[\"all_users\"]``\n= everyone, otherwise restricted) or ``None`` if no scope is set yet.\n\nThe default scope is implicit ``[\"all_users\"]`` — connector skills are\navailable to every user until an admin scopes them.","operationId":"get_connector_skill_scope_api_skills_connector__skill_name__groups_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skill_name","in":"path","required":true,"schema":{"type":"string","title":"Skill Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Skills"],"summary":"Update Connector Skill Scope","description":"Set or clear the per-skill group scope.\n\nBody: ``{\"groups\": list[str]}``. Same canonical shapes as per-action:\n``[]`` disables for everyone, ``[\"all_users\"]`` enables for everyone\n(matches the implicit default), restricted to a subset otherwise.\nStorage is compact: setting the scope to the default removes the entry.","operationId":"update_connector_skill_scope_api_skills_connector__skill_name__groups_patch","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skill_name","in":"path","required":true,"schema":{"type":"string","title":"Skill Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_connector_skill_scope_api_skills_connector__skill_name__groups_patch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/{skill_name}":{"get":{"tags":["Skills"],"summary":"Get Skill","description":"Get full skill.md content and list of supporting files.","operationId":"get_skill_api_skills__skill_name__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skill_name","in":"path","required":true,"schema":{"type":"string","title":"Skill Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Skills"],"summary":"Delete Skill","description":"Delete an entire org skill directory.","operationId":"delete_skill_api_skills__skill_name__delete","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skill_name","in":"path","required":true,"schema":{"type":"string","title":"Skill Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/{skill_name}/files/{file_path}":{"get":{"tags":["Skills"],"summary":"Get Skill File","description":"Get the content of a supporting file in a skill.","operationId":"get_skill_file_api_skills__skill_name__files__file_path__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skill_name","in":"path","required":true,"schema":{"type":"string","title":"Skill Name"}},{"name":"file_path","in":"path","required":true,"schema":{"type":"string","title":"File Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Skills"],"summary":"Delete Skill File","description":"Delete a supporting file from a skill directory.","operationId":"delete_skill_file_api_skills__skill_name__files__file_path__delete","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skill_name","in":"path","required":true,"schema":{"type":"string","title":"Skill Name"}},{"name":"file_path","in":"path","required":true,"schema":{"type":"string","title":"File Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/{skill_name}/files":{"post":{"tags":["Skills"],"summary":"Upload Skill File","description":"Upload a supporting file to a skill directory.","operationId":"upload_skill_file_api_skills__skill_name__files_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skill_name","in":"path","required":true,"schema":{"type":"string","title":"Skill Name"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_skill_file_api_skills__skill_name__files_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/{skill_name}/secrets":{"post":{"tags":["Skills"],"summary":"Set Skill Secrets","description":"Set secrets (environment variables) for a skill. Values are encrypted at rest.","operationId":"set_skill_secrets_api_skills__skill_name__secrets_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skill_name","in":"path","required":true,"schema":{"type":"string","title":"Skill Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_skill_secrets_api_skills__skill_name__secrets_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Skills"],"summary":"Get Skill Secrets Endpoint","description":"Get secret names for a skill (values are NOT returned).","operationId":"get_skill_secrets_endpoint_api_skills__skill_name__secrets_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skill_name","in":"path","required":true,"schema":{"type":"string","title":"Skill Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/skills/install-from-url":{"post":{"tags":["Skills"],"summary":"Install Skill From Url","description":"Install a skill and its supporting files from a remote SKILL.md URL.","operationId":"install_skill_from_url_api_skills_install_from_url_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_install_skill_from_url_api_skills_install_from_url_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/context-agent/proposal_events":{"get":{"tags":["context-agent"],"summary":"Subscribe To Proposal Changes","operationId":"subscribe_to_proposal_changes_api_context_agent_proposal_events_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/context-agent/chats":{"get":{"tags":["context-agent"],"summary":"List Chats","description":"List context agent chats for the user's organization.\n\nDefault: the caller's own non-empty chats for the sidebar, newest first, without\nthe transcript (``message_count`` stands in for it; the detail route serves it).\nproposals=true: the paginated proposal inbox. Admins/modelers-with-unrestricted-access\nsee every proposal in the org (any author); other users see only their own. The\ntranscript is stripped (the inbox only renders summary fields) and the result is\nfiltered by ``proposal_filter`` (open/merged/rejected/all), then by who started\neach row (``initiators``), its ``kind`` and the days its date falls on in the\nviewer's timezone, then windowed by offset/limit. Drafting proposals are kept\neven with no messages yet so the link resolves during the async window.\n\nReturns:\n    proposals=true:  {\"chats\": [...], \"total\": int, \"limit\": int, \"offset\": int,\n                      \"initiators\": [{\"id\", \"label\", \"count\"}], \"data_gap_count\": int}\n    otherwise:       {\"chats\": [...]}","operationId":"list_chats_api_context_agent_chats_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"proposals","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Proposals"}},{"name":"proposal_filter","in":"query","required":false,"schema":{"type":"string","default":"open","title":"Proposal Filter"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"initiators","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"description":"Comma-separated initiator ids; 'dot' is a routine review","title":"Initiators"},"description":"Comma-separated initiator ids; 'dot' is a routine review"},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"enum":["proposal","problem","review"],"type":"string"},{"type":"null"}],"title":"Kind"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"description":"First day shown (YYYY-MM-DD)","title":"Start Date"},"description":"First day shown (YYYY-MM-DD)"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"description":"Last day shown (YYYY-MM-DD)","title":"End Date"},"description":"Last day shown (YYYY-MM-DD)"},{"name":"tz","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"Viewer's IANA timezone for the days","title":"Tz"},"description":"Viewer's IANA timezone for the days"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["context-agent"],"summary":"Create New Chat","description":"Create a new context agent chat (new session).\n\nInitializes git repository for org (if needed) and creates isolated\nworktree for this session's file edits.\n\nReturns:\n    {\"chat_id\": \"ca_abc123\"}","operationId":"create_new_chat_api_context_agent_chats_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/context-agent/onboarding_welcome":{"post":{"tags":["context-agent"],"summary":"Open Onboarding Welcome","description":"Open the first-sync welcome chat when the viewer should get it now.\n\nOnly the admin whose connection ran the org's onboarding sync gets it, and only\nonce: the request that opens the chat receives ``{\"chat_id\", \"environment\"}``,\nevery other one ``{\"chat_id\": null}``.","operationId":"open_onboarding_welcome_api_context_agent_onboarding_welcome_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/context-agent/chats/{chat_id}":{"get":{"tags":["context-agent"],"summary":"Get Chat Details","description":"Get chat details including message history.\n\nReturns:\n    Chat document from SQLite with additional has_uncommitted_changes field","operationId":"get_chat_details_api_context_agent_chats__chat_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatDetailsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["context-agent"],"summary":"Close Chat Session","description":"Manually close a chat session (halt any run, stamp lifecycle, drop uploads).\n\nBody:\n    confirm: Must be true (CSRF protection)\n\nReturns:\n    {\"status\": \"closed\"}","operationId":"close_chat_session_api_context_agent_chats__chat_id__delete","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_close_chat_session_api_context_agent_chats__chat_id__delete"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context-agent/chats/{chat_id}/diff":{"get":{"tags":["context-agent"],"summary":"Get Chat Diff","description":"Get diff between main and session branches for this chat.\n\nReturns file changes, old/new content, and git diffs for review.\n\nReturns:\n    {\n        \"has_changes\": bool,\n        \"files\": [\n            {\n                \"path\": str,\n                \"old_content\": str,\n                \"new_content\": str,\n                \"diff\": str,\n                \"status\": str\n            }\n        ]\n    }","operationId":"get_chat_diff_api_context_agent_chats__chat_id__diff_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context-agent/chats/{chat_id}/upload":{"post":{"tags":["context-agent"],"summary":"Upload File To Chat","description":"Upload a file to a chat session for Root to analyze.\n\nFiles are stored in data/{org_id}/model/uploads/{chat_id}/ and are\naccessible to Root via the $UPLOADS_PATH environment variable.\n\nArgs:\n    chat_id: Chat ID\n    file: File to upload (max 100MB)\n\nReturns:\n    {\n        \"file_id\": \"abc12345\",\n        \"original_name\": \"data.csv\",\n        \"path\": \"abc12345_data.csv\",\n        \"size\": 1048576,\n        \"content_type\": \"text/csv\"\n    }\n\nErrors:\n    404: Chat not found\n    413: File too large (>100MB)\n    500: Failed to save file","operationId":"upload_file_to_chat_api_context_agent_chats__chat_id__upload_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_file_to_chat_api_context_agent_chats__chat_id__upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context-agent/chats/{chat_id}/import-files":{"post":{"tags":["context-agent"],"summary":"Import Files From Chat","description":"Copy uploads from another chat owned by the same user.\n\nThe 429 recovery flow stops the stuck chat (its lock can't be released)\nand creates a fresh one. Without this endpoint the new chat's uploads\ndir is empty and the resent message references files the backend can't\nfind. Both chats must belong to the same user; we never read across orgs.","operationId":"import_files_from_chat_api_context_agent_chats__chat_id__import_files_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportFilesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context-agent/chats/{chat_id}/files/{file_path}":{"get":{"tags":["context-agent"],"summary":"Download Chat File","description":"Serve a file from the chat's uploads directory as a browser download.\n\nThe agent offers files (exports, reports, large results) by saving them to\n$UPLOADS_PATH and linking this route in its reply; user uploads are\nre-downloadable the same way. Mirrors the /api/session-file security\nlayers: chat ownership, realpath containment, extension allowlist,\ndangerous-MIME hardening.","operationId":"download_chat_file_api_context_agent_chats__chat_id__files__file_path__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"file_path","in":"path","required":true,"schema":{"type":"string","title":"File Path"}},{"name":"w","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Max width for an image preview; ignored for other files","title":"W"},"description":"Max width for an image preview; ignored for other files"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context-agent/chats/{chat_id}/stream":{"post":{"tags":["context-agent"],"summary":"Stream Chat Messages","description":"Send message to context agent and stream responses via SSE.\n\nBody:\n    message: User message to send (supports large payloads)\n    attached_files: Optional list of attached files (uploaded via /upload endpoint)\n\nSSE events are the engine's schema-v1 log entries (name = event type, data =\nthe full event dict incl. index `i`): user/assistant/tool_use/tool_result,\nfiles_changed, merged, question lifecycle, and terminal complete/error, plus\ntransport-level `status` and `ping`. Legacy `cost` entries are never served\n(_UNSERVED_EVENT_TYPES).","operationId":"stream_chat_messages_api_context_agent_chats__chat_id__stream_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StreamRequestBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context-agent/chats/{chat_id}/message":{"post":{"tags":["context-agent"],"summary":"Send Midflight Message","description":"Send additional context into the SDK conversation that currently owns the chat.","operationId":"send_midflight_message_api_context_agent_chats__chat_id__message_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MidflightMessageBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context-agent/chats/{chat_id}/subscribe":{"get":{"tags":["context-agent"],"summary":"Subscribe To Chat","description":"Reconnect to an in-flight chat's SSE stream without sending a new message.\n\nReplays every logged event with index > after_index (the client's anchor from\nGET /chats/{id}.last_event_index) and then tails the live log — the event log\nis durable, so this works across workers.\n\nOrphaned-run revival: if the chat looks in-flight but no worker holds its lock\nand the engine's persisted conversation is unfinished (its worker was\nSIGKILLed mid-run), this endpoint takes the lock and restarts the turn with\nmessage=None so the run continues instead of hanging forever.","operationId":"subscribe_to_chat_api_context_agent_chats__chat_id__subscribe_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"after_index","in":"query","required":false,"schema":{"type":"integer","default":-1,"title":"After Index"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context-agent/chats/{chat_id}/github_pull_request":{"get":{"tags":["context-agent"],"summary":"Get Proposal Github Pull Request","operationId":"get_proposal_github_pull_request_api_context_agent_chats__chat_id__github_pull_request_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["context-agent"],"summary":"Open Proposal Github Pull Request","operationId":"open_proposal_github_pull_request_api_context_agent_chats__chat_id__github_pull_request_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_open_proposal_github_pull_request_api_context_agent_chats__chat_id__github_pull_request_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context-agent/chats/{chat_id}/merge":{"post":{"tags":["context-agent"],"summary":"Merge Chat To Production","description":"Merge session worktree changes to main production branch.\n\nSupports selective merge: if selected_files is provided, only those files\nare merged. Otherwise, performs a full git merge of the session branch.\n\nBody:\n    confirm: Must be true (CSRF protection)\n    selected_files: Optional list of file paths to merge selectively\n    expected_session_head: The diff's session_head the reviewer saw; 409 if it moved\n    recheck_first: Re-check a training's unmeasured changes first; the merge lands once it passes\n\nReturns:\n    {\"status\": \"success\"} or {\"status\": \"conflict\", \"conflicts\": [...], \"message\": \"...\"}","operationId":"merge_chat_to_production_api_context_agent_chats__chat_id__merge_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_merge_chat_to_production_api_context_agent_chats__chat_id__merge_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context-agent/chats/{chat_id}/reject":{"post":{"tags":["context-agent"],"summary":"Reject Chat Proposal","description":"Reject a context agent proposal. Admin/modeler only.\n\nBody:\n    confirm: Must be true (CSRF protection)\n    reason: Optional one-line reason, stored as rejected_reason and shown on the proposal\n\nReturns:\n    {\"status\": \"rejected\"}","operationId":"reject_chat_proposal_api_context_agent_chats__chat_id__reject_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_reject_chat_proposal_api_context_agent_chats__chat_id__reject_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context-agent/chats/{chat_id}/test_environment":{"post":{"tags":["context-agent"],"summary":"Create Proposal Test Environment","description":"Open a private temporary environment holding this proposal's changes, forked\nfrom current Production, so a reviewer can ask Dot before deciding. The proposal\nstill merges into Production. Returns the reviewer's existing one when it exists,\nfirst merging in what the proposal and Production gained since (``refreshed``).\nOne that cannot take those changes answers 409 ``test_environment_outdated``, since\nit may hold the reviewer's own work: with ``replace`` a new one is opened\n(``created``) and the old one stays as it is. When a new one could not take them\neither, it answers 409 ``proposal_conflicts`` (the proposal conflicts with\nProduction) or 503 (Production has a write waiting for its commit).\n\nBody:\n    replace: Optional. Open a new environment when the reviewer's own cannot be updated.\n\nReturns:\n    {\"environment\": {id, slug, name, color, ephemeral, created_by, exists},\n     \"created\": bool, \"refreshed\": bool}","operationId":"create_proposal_test_environment_api_context_agent_chats__chat_id__test_environment_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_create_proposal_test_environment_api_context_agent_chats__chat_id__test_environment_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context-agent/chats/{chat_id}/resolve":{"post":{"tags":["context-agent"],"summary":"Resolve Chat Ticket","description":"Close out a problem/review ticket. Admin/modeler only.\n\nBody:\n    resolution: \"resolved\" (handled / data now available) or \"dismissed\" (not a real gap)\n    confirm: Must be true (CSRF protection)\n\nProposals carry a diff and use merge/reject instead.","operationId":"resolve_chat_ticket_api_context_agent_chats__chat_id__resolve_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_resolve_chat_ticket_api_context_agent_chats__chat_id__resolve_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context-agent/chats/{chat_id}/stop":{"post":{"tags":["context-agent"],"summary":"Stop Chat Execution","description":"Stop active execution (engine pause between steps, per the SDK pause spec).\nSession data is preserved — a later message resumes the conversation.\n\nBody:\n    confirm: Must be true (CSRF protection)\n\nReturns:\n    {\"status\": \"stopped\"} when the run halted within the grace period, or\n    {\"status\": \"stopping\"} when it is still finishing its current step —\n    the event stream's terminal event marks the actual halt.","operationId":"stop_chat_execution_api_context_agent_chats__chat_id__stop_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_stop_chat_execution_api_context_agent_chats__chat_id__stop_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context-agent/chats/{chat_id}/answer_question":{"post":{"tags":["context-agent"],"summary":"Answer Question","description":"Answer a pending AskUserQuestion from the running agent.\n\nThe suspended turn resumes from its persisted conversation after this answer\nis durably recorded. No worker remains blocked while the user decides.","operationId":"answer_question_api_context_agent_chats__chat_id__answer_question_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnswerQuestionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context-agent/ticket_action":{"post":{"tags":["context-agent"],"summary":"Ticket Action","description":"The context agent's single ticket verb (see agent_docs/tickets.md).\n\nAuth is the agent's long-lived api:full token via Depends(get_current_user); the\norg boundary is enforced by org-scoped storage, so chat_id/ticket_id from another\norg are invisible. The agent *declares* the outcome here — the host never infers\na ticket from a diff.","operationId":"ticket_action_api_context_agent_ticket_action_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketActionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/context-agent/chats/{chat_id}/preview-note-filter":{"post":{"tags":["context-agent"],"summary":"Preview Note Filter","description":"Debug: preview which org notes the search engine selects for each question.\n\nRuns the same retrieval the agent uses (`resolve_organization_context` with\nthe main search policy) against the chat's current worktree.\n\nReturns per-question note selection, plus `note_paths`: the file in the worktree of\neach note that is not at `notes/active/<id>.md`, such as a note in a folder.\nUsed by the in-container `dot-preview-note-filter` CLI for TDD-style debugging\nof note authoring.","operationId":"preview_note_filter_api_context_agent_chats__chat_id__preview_note_filter_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewNoteFilterRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/context-agent/chats/{chat_id}/dot_session":{"post":{"tags":["context-agent"],"summary":"Start Dot Session Route","description":"Start a Dot session for an attended Context Agent run and return `{chat_id, url}`.\n\nThe new chat belongs to the Context Agent chat's user and runs in its environment;\nsee `app/context_agent/dot_session.py`.","operationId":"start_dot_session_route_api_context_agent_chats__chat_id__dot_session_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DotSessionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/github/install":{"get":{"tags":["github"],"summary":"Github Install","description":"Redirect to GitHub App installation page.\n\nThe user will install the GitHub App and grant access to repositories.\nAfter installation, GitHub redirects to /api/github/callback.","operationId":"github_install_api_github_install_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/github/callback":{"get":{"tags":["github"],"summary":"Github Callback","description":"Handle GitHub App installation callback.\n\nGitHub redirects here after the user installs/configures the app.\nStores the installation_id in the organization record.","operationId":"github_callback_api_github_callback_get","parameters":[{"name":"installation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Installation Id"}},{"name":"setup_action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Setup Action"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/github/repos":{"get":{"tags":["github"],"summary":"List Github Repos","description":"List repositories accessible to the GitHub App installation.\n\nReturns list of repos the user can select for syncing.","operationId":"list_github_repos_api_github_repos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/github/repos/create":{"post":{"tags":["github"],"summary":"Create Github Repo","description":"Create a new private GitHub repository and push existing state.\n\nCreates the repo, configures it as the sync target, and pushes all existing\nmodel files (notes, data sources, relationships) to the new repository.\n\nArgs:\n    name: Repository name (letters, numbers, hyphens, underscores, dots)\n    description: Optional repository description","operationId":"create_github_repo_api_github_repos_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_create_github_repo_api_github_repos_create_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/github/config":{"post":{"tags":["github"],"summary":"Save Github Config","description":"Save GitHub sync configuration.\n\nArgs:\n    repo_full_name: Full repository name (owner/repo)\n    branch: Branch to sync with\n    sync_enabled: Whether sync is enabled","operationId":"save_github_config_api_github_config_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_save_github_config_api_github_config_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/github/context_check/status":{"get":{"tags":["github"],"summary":"Get Github Context Check Status","description":"Whether Dot checks this workspace's pull requests, for any member: nothing to activate.","operationId":"get_github_context_check_status_api_github_context_check_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/github/disconnect":{"delete":{"tags":["github"],"summary":"Disconnect Github","description":"Disconnect GitHub integration.\n\nClears repository configuration but preserves installation_id so\nthe user can reconfigure without reinstalling the GitHub App.","operationId":"disconnect_github_api_github_disconnect_delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_disconnect_github_api_github_disconnect_delete"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/github/proposal_pull_requests":{"post":{"tags":["github"],"summary":"Set Proposal Pull Requests","operationId":"set_proposal_pull_requests_api_github_proposal_pull_requests_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_proposal_pull_requests_api_github_proposal_pull_requests_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/github/webhook":{"post":{"tags":["github"],"summary":"Github Webhook","description":"Receive GitHub webhook events.\n\nHandles:\n- push: Trigger pull when repo is updated, and tell the context check about it\n- pull_request: Reconcile linked Dot proposals, and tell the context check about the head\n- check_suite, check_run: Tell the context check about a new head or a Re-run of Dot's check\n- installation: Handle app install/uninstall and permission changes\n- installation_repositories: Handle repo access changes\n\nThe context check only records hints here (Redis, never GitHub); its own lane does the work.\nEach hint runs in a thread: recording it in Redis and enqueuing a cycle on the broker block,\nand a stalled Redis would otherwise hold every request this worker serves.","operationId":"github_webhook_api_github_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/github/sync/push":{"post":{"tags":["github"],"summary":"Manual Push","description":"Push the active environment branch, or production when in production.","operationId":"manual_push_api_github_sync_push_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/github/sync/pull":{"post":{"tags":["github"],"summary":"Manual Pull","description":"Manually trigger pull from GitHub.","operationId":"manual_pull_api_github_sync_pull_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/github/sync/settle":{"post":{"tags":["github"],"summary":"Settle Sync Conflict","description":"Settle a sync paused on a conflict, for the side the admin keeps (ENG-2054): where both\nchanged the same lines that side's lines win, every other change from both sides stays, and\nthe result is pushed. ``fingerprint`` names the conflict the admin was shown\n(model_mirror.conflict_summary): a conflict that changed since, recorded or met by the pull,\nis never settled and is answered 409 with its files to choose for.","operationId":"settle_sync_conflict_api_github_sync_settle_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_settle_sync_conflict_api_github_sync_settle_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/github/status":{"get":{"tags":["github"],"summary":"Get Github Status","description":"Get GitHub sync status for the organization.","operationId":"get_github_status_api_github_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/gitlab/connect":{"post":{"tags":["gitlab"],"summary":"Gitlab Connect","description":"Validate a Personal Access Token and store it on the org.\n\nGenerates a fresh webhook secret at the same time so the user can paste\nit into GitLab's project webhook settings.","operationId":"gitlab_connect_api_gitlab_connect_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_gitlab_connect_api_gitlab_connect_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/gitlab/projects":{"get":{"tags":["gitlab"],"summary":"List Projects","description":"List GitLab projects accessible to the configured token.","operationId":"list_projects_api_gitlab_projects_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/gitlab/projects/create":{"post":{"tags":["gitlab"],"summary":"Create Project","description":"Create a new private GitLab project and push existing state.","operationId":"create_project_api_gitlab_projects_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_create_project_api_gitlab_projects_create_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/gitlab/config":{"post":{"tags":["gitlab"],"summary":"Save Config","description":"Save GitLab project + branch + sync_enabled.","operationId":"save_config_api_gitlab_config_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_save_config_api_gitlab_config_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/gitlab/disconnect":{"delete":{"tags":["gitlab"],"summary":"Disconnect","description":"Clear all GitLab fields (token + config + webhook secret).","operationId":"disconnect_api_gitlab_disconnect_delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_disconnect_api_gitlab_disconnect_delete"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/gitlab/webhook":{"post":{"tags":["gitlab"],"summary":"Gitlab Webhook","description":"Receive GitLab webhook events (only Push Hook is acted on).","operationId":"gitlab_webhook_api_gitlab_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/gitlab/sync/push":{"post":{"tags":["gitlab"],"summary":"Manual Push","operationId":"manual_push_api_gitlab_sync_push_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/gitlab/sync/pull":{"post":{"tags":["gitlab"],"summary":"Manual Pull","operationId":"manual_pull_api_gitlab_sync_pull_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/gitlab/sync/settle":{"post":{"tags":["gitlab"],"summary":"Settle Sync Conflict","description":"Settle a sync paused on a conflict, for the side the admin keeps (ENG-2054): where both\nchanged the same lines that side's lines win, every other change from both sides stays, and\nthe result is pushed. ``fingerprint`` names the conflict the admin was shown\n(model_mirror.conflict_summary): a conflict that changed since, recorded or met by the pull,\nis never settled and is answered 409 with its files to choose for.","operationId":"settle_sync_conflict_api_gitlab_sync_settle_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_settle_sync_conflict_api_gitlab_sync_settle_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/gitlab/status":{"get":{"tags":["gitlab"],"summary":"Get Status","description":"Return sync status. Non-admins get connection state but not the webhook secret.","operationId":"get_status_api_gitlab_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/transcribe":{"post":{"tags":["Transcription"],"summary":"Transcribe Audio","description":"Transcribe audio using Gemini Flash via REST API.","operationId":"transcribe_audio_api_transcribe_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_transcribe_audio_api_transcribe_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/apps":{"get":{"tags":["apps"],"summary":"Api List Apps","description":"List apps visible to the current user.","operationId":"api_list_apps_api_apps_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"archived","in":"query","required":false,"schema":{"type":"boolean","description":"List archived apps instead of active ones","default":false,"title":"Archived"},"description":"List archived apps instead of active ones"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Api List Apps Api Apps Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["apps"],"summary":"Api Create App","description":"Create an app, serializing the full lifecycle of a chat-backed draft.","operationId":"api_create_app_api_apps_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAppRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Create App Api Apps Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/drafts":{"get":{"tags":["apps"],"summary":"Api List Drafts","description":"List unpublished session drafts owned by the current user.","operationId":"api_list_drafts_api_apps_drafts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Api List Drafts Api Apps Drafts Get"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/apps/chat_binding/{chat_id}":{"get":{"tags":["apps"],"summary":"Api Chat Bound App","description":"The published app a chat is bound to (report_context.dashboard_id), if\nit still exists. Lets the editor resume a bound chat in edit mode instead\nof stranding it at ?app=new, where rename and publish-in-place are gated\noff. Defined before the /apps/{app_id} wildcard.","operationId":"api_chat_bound_app_api_apps_chat_binding__chat_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Chat Bound App Api Apps Chat Binding  Chat Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/folders":{"get":{"tags":["apps"],"summary":"Api List Folders","description":"List shared folder paths the user may view or edit (admins see all).\n\n`writable=true` narrows it to the ones they may publish into, so a\ndestination picker offers only folders that won't 403 on save.","operationId":"api_list_folders_api_apps_folders_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"writable","in":"query","required":false,"schema":{"type":"boolean","description":"Only folders the caller may publish into","default":false,"title":"Writable"},"description":"Only folders the caller may publish into"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Response Api List Folders Api Apps Folders Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["apps"],"summary":"Api Create Folder","description":"Create a new shared folder. Requires admin role.","operationId":"api_create_folder_api_apps_folders_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFolderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Create Folder Api Apps Folders Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/shared_destinations":{"get":{"tags":["apps"],"summary":"Api Shared Destinations","description":"Where in Shared this user may publish: the root, and which folders.\n\nThe picker asks for this instead of guessing from the caller's role, so it\noffers a destination only when saving there will actually work.","operationId":"api_shared_destinations_api_apps_shared_destinations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Shared Destinations Api Apps Shared Destinations Get"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/apps/folders/{folder_path}/rename":{"post":{"tags":["apps"],"summary":"Api Rename Folder","description":"Rename a shared folder (last path segment). Requires admin role.","operationId":"api_rename_folder_api_apps_folders__folder_path__rename_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"folder_path","in":"path","required":true,"schema":{"type":"string","title":"Folder Path"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameFolderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Rename Folder Api Apps Folders  Folder Path  Rename Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/folders/{folder_path}/move":{"post":{"tags":["apps"],"summary":"Api Move Folder","description":"Move a shared folder into another folder. Requires admin role.","operationId":"api_move_folder_api_apps_folders__folder_path__move_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"folder_path","in":"path","required":true,"schema":{"type":"string","title":"Folder Path"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveFolderRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Move Folder Api Apps Folders  Folder Path  Move Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/folders/{folder_path}":{"delete":{"tags":["apps"],"summary":"Api Delete Folder","description":"Delete a shared folder. Requires admin role.\n\nIf force=true, deletes all apps within. Otherwise fails if non-empty.","operationId":"api_delete_folder_api_apps_folders__folder_path__delete","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"folder_path","in":"path","required":true,"schema":{"type":"string","title":"Folder Path"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Force"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Delete Folder Api Apps Folders  Folder Path  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/folders/{folder_path}/permissions":{"get":{"tags":["apps"],"summary":"Api Get Folder Permissions","description":"Get permissions for a folder.","operationId":"api_get_folder_permissions_api_apps_folders__folder_path__permissions_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"folder_path","in":"path","required":true,"schema":{"type":"string","title":"Folder Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Get Folder Permissions Api Apps Folders  Folder Path  Permissions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["apps"],"summary":"Api Set Folder Permissions","description":"Set permissions for a folder. Requires admin role.","operationId":"api_set_folder_permissions_api_apps_folders__folder_path__permissions_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"folder_path","in":"path","required":true,"schema":{"type":"string","title":"Folder Path"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderPermissionsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Set Folder Permissions Api Apps Folders  Folder Path  Permissions Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/folders/groups":{"get":{"tags":["apps"],"summary":"Api Get Org Groups","description":"Get all groups in the org (for the permission picker UI).","operationId":"api_get_org_groups_api_apps_folders_groups_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Response Api Get Org Groups Api Apps Folders Groups Get"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/apps/status":{"get":{"tags":["apps"],"summary":"Api Apps Status","description":"Org-wide app lock freshness summary for app-as-code workflows.","operationId":"api_apps_status_api_apps_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Apps Status Api Apps Status Get"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/apps/deps":{"get":{"tags":["apps"],"summary":"Api Apps Deps","description":"Blast radius for a table or schema.table.column reference.","operationId":"api_apps_deps_api_apps_deps_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"ref","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Ref"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Apps Deps Api Apps Deps Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/runtime/receipt":{"post":{"tags":["apps"],"summary":"Api App Runtime Receipt","description":"File what a viewer's browser waited for on one open, filter or refresh.\n\nThe server sees when it finished sending; only the browser knows when the cards were\non screen. Answers 204 whatever the report holds, so it says nothing about which apps\nexist and needs no access check: the org and the viewer are the session's own, and a\nreport can only ever describe its sender. Registered ahead of the `/apps/{app_id}`\nroutes so `runtime` is never read as an app id.","operationId":"api_app_runtime_receipt_api_apps_runtime_receipt_post","responses":{"204":{"description":"Successful Response"}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/apps/{app_id}":{"get":{"tags":["apps"],"summary":"Api Get App","description":"Get app source and metadata.","operationId":"api_get_app_api_apps__app_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Get App Api Apps  App Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["apps"],"summary":"Api Update App","description":"Update app source, or create it when the id doesn't exist yet (CLI push).\n\nBuild the new source into an AppBuild before activating it so runtime\nrender never needs an LLM compile-on-miss. This preserves the \"Add\nVisualization\" flow where the frontend sends the full modified source.","operationId":"api_update_app_api_apps__app_id__put","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAppRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Update App Api Apps  App Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["apps"],"summary":"Api Delete App","description":"Delete an app.","operationId":"api_delete_app_api_apps__app_id__delete","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Delete App Api Apps  App Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/lock":{"get":{"tags":["apps"],"summary":"Api Get App Lock","description":"The committed lock sidecar (docs/apps-compiled-spec.md), compiled\nqueries for a saved app. Same visibility as the source itself.","operationId":"api_get_app_lock_api_apps__app_id__lock_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Get App Lock Api Apps  App Id  Lock Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/status":{"get":{"tags":["apps"],"summary":"Api App Status","description":"Per-query lock freshness for one app.","operationId":"api_app_status_api_apps__app_id__status_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api App Status Api Apps  App Id  Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/manifest":{"get":{"tags":["apps"],"summary":"Api App Manifest","description":"Derived dependency manifest for one app.","operationId":"api_app_manifest_api_apps__app_id__manifest_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api App Manifest Api Apps  App Id  Manifest Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/lineage":{"get":{"tags":["apps"],"summary":"Api App Lineage","description":"Where this app's data comes from: cards → queries → tables → dbt models → sources.\n\nMember-only, like every other endpoint in this namespace — there is no public/embed twin.\n`include_usage` opts into the \"also used by N apps\" fan-out, which is the one part that\nneeds an org-wide sweep; the graph itself never waits on it.","operationId":"api_app_lineage_api_apps__app_id__lineage_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"include_usage","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Usage"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api App Lineage Api Apps  App Id  Lineage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/lineage/column":{"get":{"tags":["apps"],"summary":"Api App Column Lineage","description":"Trace one output column of one query back to the source columns it came from.\n\nThe gesture behind a cited number. Computed on click for a single column — never for\nevery column at build (which is how column-level lineage turns a graph into a hairball).","operationId":"api_app_column_lineage_api_apps__app_id__lineage_column_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"query","in":"query","required":true,"schema":{"type":"string","title":"Query"}},{"name":"column","in":"query","required":true,"schema":{"type":"string","title":"Column"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api App Column Lineage Api Apps  App Id  Lineage Column Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/pdf":{"get":{"tags":["apps"],"summary":"Api Get App Pdf","description":"Render the app to a PDF (headless Chromium) and stream it.\n\nReuses the view_app render surface: a short-lived token renders the real\nlight-theme embed, Chromium prints it, and a link points back to the live\nreport. The viewer's filter selections ride the query string so the export\nis the view they are looking at, not the app's defaults. `pdf-layout` is\n`pages` (A4, the default) or `one_page` (one page sized to the app).","operationId":"api_get_app_pdf_api_apps__app_id__pdf_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/shell":{"get":{"tags":["apps"],"summary":"Api Get App Shell","description":"Return the active AppBuild shell. No data execution and no compile.","operationId":"api_get_app_shell_api_apps__app_id__shell_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/state":{"get":{"tags":["apps"],"summary":"Api Member App State Get","description":"This viewer's saved app state, in-product (ENG-1143).\n\nThe framed twin of this lives under `/apps/public/{token}/state`, where the\nviewer comes from a render token because the frame is credential-free. Both\nkey the viewer through `_state_viewer_id`, so it is literally the same bag\nand an app behaves the same wherever it is opened.","operationId":"api_member_app_state_get_api_apps__app_id__state_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["apps"],"summary":"Api Member App State Post","description":"Merge a patch into this viewer's saved app state, in-product (ENG-1143).","operationId":"api_member_app_state_post_api_apps__app_id__state_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/usage":{"get":{"tags":["apps"],"summary":"Api Get App Usage","description":"Usage breakdown and lifecycle state: feeds the usage popover, its full\nviewer list and the archived banner. Visible to anyone who can view the\napp; a Storefront customer gets the totals without anyone's name.","operationId":"api_get_app_usage_api_apps__app_id__usage_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Get App Usage Api Apps  App Id  Usage Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/archive":{"post":{"tags":["apps"],"summary":"Api Set App Archived","description":"Archive or unarchive an app (edit permission). Archiving removes the\napp from discovery surfaces only — direct links and share tokens keep\nworking, and it's one click to reverse.","operationId":"api_set_app_archived_api_apps__app_id__archive_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_api_set_app_archived_api_apps__app_id__archive_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Set App Archived Api Apps  App Id  Archive Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/builds/{build_id}":{"get":{"tags":["apps"],"summary":"Api Get App Build Status","description":"Poll a specific build's status by id.\n\nPUT/POST/build all return the build_id; a client whose request timed out\nmid-build can poll this to learn the real outcome instead of inferring\nliveness from the runtime. Returns the AppBuild plus an `ok` flag and, when\nthe build genuinely failed, the structured failure payload.","operationId":"api_get_app_build_status_api_apps__app_id__builds__build_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"build_id","in":"path","required":true,"schema":{"type":"string","title":"Build Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Get App Build Status Api Apps  App Id  Builds  Build Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/versions":{"get":{"tags":["apps"],"summary":"Api List App Versions","description":"The app's versions, newest first — every commit on the active branch that\nchanged the app (publish, restore, move, CLI push, GitHub pull, agent merge),\nlabelled from its content (see `app.app_versions`). The first entry is the\none the app currently serves.","operationId":"api_list_app_versions_api_apps__app_id__versions_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Api List App Versions Api Apps  App Id  Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/versions/{sha}/source":{"get":{"tags":["apps"],"summary":"Api Get App Version Source","description":"The app's source at one listed version (read-only), for everyone who can\nview the app — the same people who may read the live source and who see the\nversion rendered. Only shas from `/versions` resolve, so no caller can read an\narbitrary commit through an app it may view.","operationId":"api_get_app_version_source_api_apps__app_id__versions__sha__source_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"sha","in":"path","required":true,"schema":{"type":"string","title":"Sha"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Get App Version Source Api Apps  App Id  Versions  Sha  Source Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/versions/{sha}/build":{"post":{"tags":["apps"],"summary":"Api Prepare App Version","description":"Get a version ready to be looked at — the page asks this first so a\nversion that no longer builds is refused before anything on screen changes.\nReturns the version with the id of the build that will serve it.","operationId":"api_prepare_app_version_api_apps__app_id__versions__sha__build_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"sha","in":"path","required":true,"schema":{"type":"string","title":"Sha"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Prepare App Version Api Apps  App Id  Versions  Sha  Build Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/versions/{sha}/runtime/stream":{"post":{"tags":["apps"],"summary":"Api App Version Runtime Stream","description":"Run one version of the app, read-only, the way `/runtime/stream` runs the\nlive one. Data is fetched now, against today's warehouse; only the app is\nold. Not counted as a view of the app: browsing its history is not using it.","operationId":"api_app_version_runtime_stream_api_apps__app_id__versions__sha__runtime_stream_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"sha","in":"path","required":true,"schema":{"type":"string","title":"Sha"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRuntimeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/versions/{sha}/queries/{query_name}":{"post":{"tags":["apps"],"summary":"Api App Version Query","operationId":"api_app_version_query_api_apps__app_id__versions__sha__queries__query_name__post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"sha","in":"path","required":true,"schema":{"type":"string","title":"Sha"}},{"name":"query_name","in":"path","required":true,"schema":{"type":"string","title":"Query Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppQueryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/versions/{sha}/restore":{"post":{"tags":["apps"],"summary":"Api Restore App Version","description":"Make an earlier version the live one — the counterpart of Publish.\n\nThe one write in version history. In the browser it is the \"Restore this\nversion\" button on a version being looked at (`/versions/{sha}/build` +\n`/runtime/stream` show it first, touching nothing); from the CLI it is `dot\napps restore`. Editors only. Any edit draft stays exactly as it was.\n\nRecorded like any other publish: the bundle is written, built and committed as\na new version, so the version this replaces stays in the history and the\nrestore itself can be restored. The build reuses the charts of the view the\nperson just looked at, so what goes live is what they saw.","operationId":"api_restore_app_version_api_apps__app_id__versions__sha__restore_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"sha","in":"path","required":true,"schema":{"type":"string","title":"Sha"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Restore App Version Api Apps  App Id  Versions  Sha  Restore Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/runtime/stream":{"post":{"tags":["apps"],"summary":"Api App Runtime Stream","description":"Execute fresh data from the active AppBuild without compiling the app.","operationId":"api_app_runtime_stream_api_apps__app_id__runtime_stream_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRuntimeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/runtime":{"post":{"tags":["apps"],"summary":"Api App Runtime","description":"Non-streaming fresh-data runtime from the active AppBuild.","operationId":"api_app_runtime_api_apps__app_id__runtime_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRuntimeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api App Runtime Api Apps  App Id  Runtime Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/queries/{query_name}":{"post":{"tags":["apps"],"summary":"Api App Query","operationId":"api_app_query_api_apps__app_id__queries__query_name__post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"query_name","in":"path","required":true,"schema":{"type":"string","title":"Query Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppQueryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/build":{"post":{"tags":["apps"],"summary":"Api Build Saved App","description":"Build the saved `.app` source and activate a ready AppBuild.","operationId":"api_build_saved_app_api_apps__app_id__build_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Build Saved App Api Apps  App Id  Build Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/resolve":{"post":{"tags":["apps"],"summary":"Api Resolve App","description":"Incremental resolve (docs/apps-compiled-spec.md): recompile request-form\nqueries whose compile inputs changed, write the committed `.app.lock`, and\nreturn per-query outcomes with old/new compiled text for diff review.\nQueries whose inputs match the lock are never sent to the LLM. Does not\nexecute the query DAG or activate a build.","operationId":"api_resolve_app_api_apps__app_id__resolve_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Resolve App Api Apps  App Id  Resolve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/validate":{"post":{"tags":["apps"],"summary":"Api Validate App Lock","description":"Drift check: run the existing post-compile validator (sqlglot parse +\nEXPLAIN dry-run) over every locked query. No LLM involved; additive schema\nchanges never fire — only real binding breaks do.","operationId":"api_validate_app_lock_api_apps__app_id__validate_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Validate App Lock Api Apps  App Id  Validate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/bless":{"post":{"tags":["apps"],"summary":"Api Bless App Lock","description":"Accept reviewed compiled SQL edits by validating and re-stamping digests.","operationId":"api_bless_app_lock_api_apps__app_id__bless_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/BlessLockRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Bless App Lock Api Apps  App Id  Bless Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/refactor":{"post":{"tags":["apps"],"summary":"Api Refactor Org Locks","description":"Org-wide mechanical rename across every app's locked SQL — the\ndata-model refactor sweep (docs/apps-compiled-spec.md §6). sqlglot AST,\nno LLM; each rewrite re-validated. Admin only; `dry_run` previews.","operationId":"api_refactor_org_locks_api_apps_refactor_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefactorLockRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Refactor Org Locks Api Apps Refactor Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/apps/{app_id}/refactor":{"post":{"tags":["apps"],"summary":"Api Refactor App Lock","description":"Mechanically rename columns/tables in this app's locked SQL (sqlglot\nAST, no LLM), re-validating each rewrite. `dry_run` returns the would-be\ndiff without writing.","operationId":"api_refactor_app_lock_api_apps__app_id__refactor_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefactorLockRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Refactor App Lock Api Apps  App Id  Refactor Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/drafts/{chat_id}":{"delete":{"tags":["apps"],"summary":"Api Delete Draft App","description":"Delete the current user's app draft without deleting its chat.","operationId":"api_delete_draft_app_api_apps_drafts__chat_id__delete","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Delete Draft App Api Apps Drafts  Chat Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/move":{"post":{"tags":["apps"],"summary":"Api Move App","description":"Move an app between personal and shared.","operationId":"api_move_app_api_apps__app_id__move_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveAppRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Move App Api Apps  App Id  Move Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/rename":{"post":{"tags":["apps"],"summary":"Api Rename App","description":"Rename an app — metadata-only edit of the <title> tag.\n\nA title change can't introduce build errors, so this bypasses the\nfull PUT/build path (which 409s on any pre-existing build failure\nand would silently lose the rename). The app_id / URL / filename\nstay stable so share links and bookmarks survive.\n\nMirrors the new title onto the active build's `shell.json` so a\ncold reload reflects the rename without waiting for a rebuild.","operationId":"api_rename_app_api_apps__app_id__rename_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameAppRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Rename App Api Apps  App Id  Rename Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/owner":{"post":{"tags":["apps"],"summary":"Api Transfer App Owner","description":"Hand an app to a new owner — metadata-only edit of the owner meta.\n\nOwnership now grants edit, so it needs a real door: without one, an app\nwhose owner has left is editable by admins alone, forever. Admins may\ntransfer any app; the current owner may hand off their own.\n\nPersonal apps are owned by the folder they sit in, so transferring one means\nmoving it — use `/move` instead of silently disagreeing with the path.","operationId":"api_transfer_app_owner_api_apps__app_id__owner_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferOwnerRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Transfer App Owner Api Apps  App Id  Owner Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/lint":{"post":{"tags":["apps"],"summary":"Api Lint App","description":"Build lint output while serializing chat-backed draft state.","operationId":"api_lint_app_api_apps_lint_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Lint App Api Apps Lint Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/apps/preview":{"post":{"tags":["apps"],"summary":"Api Preview App","description":"Build and execute a preview while serializing chat-backed draft state.","operationId":"api_preview_app_api_apps_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Preview App Api Apps Preview Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/apps/preview/stream":{"post":{"tags":["apps"],"summary":"Api Preview App Stream","description":"Streaming preview over the AppBuild artifact for this source.\n\nReuses the build the agent's lint hook activated for matching source,\nso the preview consumes exactly what the agent validated.","operationId":"api_preview_app_stream_api_apps_preview_stream_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/apps/session/{chat_id}/cards/{card_id}/edit":{"post":{"tags":["apps"],"summary":"Api Edit Session Chart","description":"Preview a chart edit while serializing this draft's build state.","operationId":"api_edit_session_chart_api_apps_session__chat_id__cards__card_id__edit_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"card_id","in":"path","required":true,"schema":{"type":"string","title":"Card Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditChartRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Edit Session Chart Api Apps Session  Chat Id  Cards  Card Id  Edit Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/cards/{card_id}/edit":{"post":{"tags":["apps"],"summary":"Api Edit App Chart","description":"Edit a chart card: re-run its query and regenerate the chart with a modification request.","operationId":"api_edit_app_chart_api_apps__app_id__cards__card_id__edit_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"card_id","in":"path","required":true,"schema":{"type":"string","title":"Card Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditChartRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Edit App Chart Api Apps  App Id  Cards  Card Id  Edit Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/session/{chat_id}/cards/{card_id}/save":{"post":{"tags":["apps"],"summary":"Api Save Session Chart Edit","description":"Persist a chart edit while serializing this draft's source and build.","operationId":"api_save_session_chart_edit_api_apps_session__chat_id__cards__card_id__save_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"card_id","in":"path","required":true,"schema":{"type":"string","title":"Card Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveChartEditRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Save Session Chart Edit Api Apps Session  Chat Id  Cards  Card Id  Save Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/edit-chat":{"get":{"tags":["apps"],"summary":"Api Get Edit Chat","description":"Find the conversation that built this app, for the current user.\n\nReturns the user's OLDEST chat bound to this app — the conversation\nthat initially created it (`set_chat_dashboard_id` stamps the creating\nchat at first publish) — so Edit always returns to the build thread\nrather than whichever tweak session happened to be most recent.\nAsk-mode chats live under `additional_metadata.app_context` and never\nmatch this lookup.\n\nReturns { chat_id } — null when no edit chat exists. \"No chat yet\" is\nthe normal state for most apps, not an error: as a 404 it printed a\nbrowser console error on every such Edit-resume lookup, which tripped\nzero-console-error E2E gates and looked like a bug to users' devtools.","operationId":"api_get_edit_chat_api_apps__app_id__edit_chat_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Get Edit Chat Api Apps  App Id  Edit Chat Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/ask-chat":{"get":{"tags":["apps"],"summary":"Api Get Ask Chat","description":"Find the current user's recent ask-mode chat about this app.\n\nAsk chats are analysis conversations (no app editing) stamped with\n`additional_metadata.app_context.dashboard_id`. Resume within 7 days\nso a returning user continues their train of thought; older threads\nare stale enough that a fresh chat is the better default.\nReturns { chat_id } — null when none exists (same no-404 convention\nas `/edit-chat`: \"no chat yet\" is normal, not a console error).","operationId":"api_get_ask_chat_api_apps__app_id__ask_chat_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Get Ask Chat Api Apps  App Id  Ask Chat Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/session/{chat_id}/queries/{query_name}":{"post":{"tags":["apps"],"summary":"Api Session App Query","operationId":"api_session_app_query_api_apps_session__chat_id__queries__query_name__post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"query_name","in":"path","required":true,"schema":{"type":"string","title":"Query Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppSessionQueryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/session/{chat_id}/{filename}":{"get":{"tags":["apps"],"summary":"Api Get Session File","description":"Fetch a file written by the agent in a chat session.\n\nUsed by the edit-via-chat feature to read modified .app files\nfor live preview.","operationId":"api_get_session_file_api_apps_session__chat_id___filename__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}},{"name":"allow_missing","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Allow Missing"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Get Session File Api Apps Session  Chat Id   Filename  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["apps"],"summary":"Api Write Session File","description":"Write a session file while serializing this draft's source and build.","operationId":"api_write_session_file_api_apps_session__chat_id___filename__post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}},{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAppRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Write Session File Api Apps Session  Chat Id   Filename  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/session/{chat_id}/theme":{"post":{"tags":["apps"],"summary":"Api Set Session Theme","description":"Apply a theme while serializing this draft's source and build.","operationId":"api_set_session_theme_api_apps_session__chat_id__theme_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetSessionThemeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Set Session Theme Api Apps Session  Chat Id  Theme Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/session/{chat_id}/runtime_errors":{"post":{"tags":["apps"],"summary":"Api Report Session Runtime Errors","description":"Record client-captured runtime/CSP errors from a rendered app preview.\n\nTagged with the rendered source's sha so the repair loop only surfaces\nerrors for the current app version. Owner classification (platform vs agent)\nhappens at read time in `app.app_runtime_errors.classify_runtime_errors`.\nRegistered before the `/{filename}` wildcard so it isn't swallowed by it.","operationId":"api_report_session_runtime_errors_api_apps_session__chat_id__runtime_errors_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"chat_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeErrorsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Report Session Runtime Errors Api Apps Session  Chat Id  Runtime Errors Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/publish":{"post":{"tags":["apps"],"summary":"Api Publish","description":"Publish an app from a chat session.\n\nSingle flow: promote the chat's lint artifacts into the published\nnamespace and atomically commit the new `.app` file to git (Phase B).\nThe frontend always sends `chat_id` — the Edit-click flow seeds a\nchat session from the published source (via /theme's\n`init_from_app_id`) so even \"I just clicked Edit and tweaked a color\"\ngoes through this single path. The legacy editor-publish path that\nread from a separate `.draft` file is retired (Phase C).","operationId":"api_publish_api_apps__app_id__publish_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Publish Api Apps  App Id  Publish Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/{app_id}/share":{"get":{"tags":["apps"],"summary":"Api Get Sharing","description":"Read the current dashboard-only link without creating one.","operationId":"api_get_sharing_api_apps__app_id__share_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Get Sharing Api Apps  App Id  Share Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["apps"],"summary":"Api Enable Sharing","description":"Enable sharing and return an embed link.\n\nToken creation is allowed regardless of the org's \"Public links\" setting —\nlike chat share links, the link itself is gated at view time (see\n_enforce_public_link_access): with public links off, only signed-in org\nmembers can open it.\n\nAnyone who can edit the app can manage its public link. The embed still\nexecutes as the app owner and remains subject to the app's public-data policy.","operationId":"api_enable_sharing_api_apps__app_id__share_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Enable Sharing Api Apps  App Id  Share Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["apps"],"summary":"Api Revoke Sharing","description":"Revoke the share link.","operationId":"api_revoke_sharing_api_apps__app_id__share_delete","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Api Revoke Sharing Api Apps  App Id  Share Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/public/{token}/shell":{"get":{"tags":["apps"],"summary":"Api Public App Shell","description":"Public embed endpoint — optional auth, gated by the org's Public links setting.","operationId":"api_public_app_shell_api_apps_public__token__shell_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"token","in":"path","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/apps/public/{token}":{"get":{"tags":["apps"],"summary":"Api Public App","description":"Public embed endpoint — optional auth, gated by the org's Public links setting.\n\nAccepts filter params as query parameters (e.g., ?status=cancelled&payment_method=paypal).\nOnly params defined in the app's config are used; unknown params are ignored.\nResults are cached for 5 minutes per (token, params) combination.","operationId":"api_public_app_api_apps_public__token__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"token","in":"path","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/apps/public/{token}/runtime":{"post":{"tags":["apps"],"summary":"Api Public App Runtime","description":"Public runtime over the active AppBuild's per-query memo, no live compile.\n\nHonours body.refresh (default False), so an embed/share view serves the stored\nresult rather than re-running the warehouse on every load. The stored result\nfollows the app's freshness like any view (app_memo.result_max_age_s): a live\napp re-runs once it is minutes old, a scheduled one once a scheduled run time\nhas passed since the result was written (this process's response cache may\nserve it up to _PUBLIC_CACHE_TTL longer).\nA rebuild mints a new build with an empty memo. A member's ad-hoc Refresh writes\nonly their own viewer scope (see _user_scope's viewer key) and never reaches\nthis one.","operationId":"api_public_app_runtime_api_apps_public__token__runtime_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicAppRuntimeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/public/{token}/queries/{query_name}":{"post":{"tags":["apps"],"summary":"Api Public App Query","operationId":"api_public_app_query_api_apps_public__token__queries__query_name__post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"query_name","in":"path","required":true,"schema":{"type":"string","title":"Query Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppQueryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/apps/sandbox/{token}":{"get":{"tags":["apps"],"summary":"Api Sandbox App","description":"Credential-free isolation envelope for a public app (ENG-1143).\n\nServes author content inside `<iframe sandbox=\"allow-scripts allow-forms\">`\nunder a strict, immutable `default-src 'none'` CSP, so app JS runs in an\nopaque origin that can neither read the viewer's Dot session/cookies nor\nexfiltrate cross-origin. Gated by the org's Public-links setting exactly like\n`/apps/public/{token}` (`_resolve_public_app` raises 401 for a restricted\norg viewed anonymously), and it inherits `_public_cache_control` so a\nmember-gated render never lands in a shared cache.\n\nWho may frame it depends on what it can reach: a member-gated wrapper is\nrestricted to our own origins, because the broker calls the API with the\nviewer's session and author JS could postMessage the answer to a hostile\nancestor. A public wrapper stays open — third-party oEmbed embedding is the\npoint — and instead loses per-viewer state brokering when framed cross-site.\n\nThe frame is handed no token of its own: this document brokers its API\ncalls, authorizing each against `token` here — which the frame cannot read.\nViews are counted when the broker fetches `/apps/public/{token}`, so\ncounting here too would double every open.","operationId":"api_sandbox_app_api_apps_sandbox__token__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"token","in":"path","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/apps/public/{token}/state":{"get":{"tags":["apps"],"summary":"Api App State Get","description":"This viewer's saved state for this app (ENG-1143).","operationId":"api_app_state_get_api_apps_public__token__state_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"token","in":"path","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"}}}}}},"post":{"tags":["apps"],"summary":"Api App State Put","description":"Merge a patch into this viewer's saved state for this app (ENG-1143).\n\nPOST with a `text/plain` body on purpose: the caller is a sandboxed frame,\nwhose opaque origin makes every request cross-origin. A PUT or a JSON\ncontent-type would trigger a CORS preflight, and answering preflights would\nmean opening methods and headers on a token-gated public endpoint. This\nshape is a \"simple request\" — no preflight to answer, no CORS surface added,\nand it is what `navigator.sendBeacon` can send as the page goes away.\n\nBody: `{\"patch\": {...}, \"remove\": [\"key\", ...]}`. A patch rather than a\nwhole document so two tabs of the same app cannot delete each other's keys.","operationId":"api_app_state_put_api_apps_public__token__state_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"token","in":"path","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/dbt/exposures":{"get":{"tags":["quality"],"summary":"Get Dbt Exposures","description":"The shared dashboards the caller can see, as a dbt exposures file\n`ref()`-linked to the dbt models they consume. Scoped to one dbt repo\nconnection (`?connection_id=` required only when several exist);\n`?format=json` adds coverage detail.","operationId":"get_dbt_exposures_api_dbt_exposures_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"yaml","title":"Format"}},{"name":"connection_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Connection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dbt/run_results":{"post":{"tags":["quality"],"summary":"Post Dbt Run Results","description":"Ingest a dbt run_results.json (curl -d @target/run_results.json from\nAirflow/CI). Failing tests/models open table incidents; passing ones\nclear them. Wrap as {\"run_results\": ..., \"manifest\": ...} to let test\nand source nodes resolve to their physical tables. Admin-only: this\nwrites org-wide incident badges shown to every dashboard viewer.","operationId":"post_dbt_run_results_api_dbt_run_results_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/quality/incidents":{"get":{"tags":["quality"],"summary":"Get Quality Incidents","description":"Open incidents for the org, most recent first. Model-role gated: the\nraw listing spans all tables regardless of group visibility — viewers get\ntheir app-scoped view from /quality/status.","operationId":"get_quality_incidents_api_quality_incidents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]},"post":{"tags":["quality"],"summary":"Post Quality Incidents","description":"Generic incident reports from non-dbt tooling:\n{\"items\": [{table, check, status: open|resolved, severity, message, url}]}.\nAdmin-only: writes org-wide incident badges shown to every viewer.","operationId":"post_quality_incidents_api_quality_incidents_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/quality/status":{"get":{"tags":["quality"],"summary":"Get Quality Status","description":"Open incidents mapped onto the dashboards the caller can see —\nfeeds the amber chip in the apps list and the banner on the app page.","operationId":"get_quality_status_api_quality_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/certification/set":{"post":{"tags":["certification"],"summary":"Set App Certification","description":"Set or clear a dashboard's certification (admin/modeler only).\n\n`state='none'` removes it. Role proves the caller *may* certify; tenant\nisolation is enforced separately — the app must resolve to and exist in the\ncaller's own org (or their workspace org), never an org_id from the body.","operationId":"set_app_certification_api_certification_set_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_app_certification_api_certification_set_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Set App Certification Api Certification Set Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/certification/status":{"get":{"tags":["certification"],"summary":"Get Certification Status","description":"Certification state for every app the caller can see — feeds the\nCertified badge on the app page and the chip/filter on the apps list.\nViewer-open (read), scoped to the caller's visible apps.","operationId":"get_certification_status_api_certification_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Certification Status Api Certification Status Get"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/newsletter/unsubscribe":{"get":{"tags":["Newsletter"],"summary":"Unsubscribe Page","operationId":"unsubscribe_page_api_newsletter_unsubscribe_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Newsletter"],"summary":"Unsubscribe","operationId":"unsubscribe_api_newsletter_unsubscribe_post","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}},{"name":"forwarded","in":"query","required":false,"schema":{"type":"string","default":"","title":"Forwarded"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newsletter/resubscribe":{"post":{"tags":["Newsletter"],"summary":"Resubscribe","operationId":"resubscribe_api_newsletter_resubscribe_post","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}},{"name":"forwarded","in":"query","required":false,"schema":{"type":"string","default":"","title":"Forwarded"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newsletter/mailersend_webhook":{"post":{"tags":["Newsletter"],"summary":"Mailersend Webhook","description":"MailerSend activity webhook: hard bounces and spam complaints land on\nthe suppression list so no future issue mails those addresses again (the\nJuly 2026 bounce rate put the account under review). Signature is\nHMAC-SHA256 of the raw body with the webhook's signing secret.\n\nOnly suppression events demand a valid signature: MailerSend's creation\nping (webhook.test) is signed with a fixed test secret and must get a 2xx\nor the webhook can't be registered — and it arrives before the operator\nhas had any chance to configure our signing-secret env var.","operationId":"mailersend_webhook_api_newsletter_mailersend_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/newsletter/subscription":{"get":{"tags":["Newsletter"],"summary":"Get Subscription","operationId":"get_subscription_api_newsletter_subscription_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]},"post":{"tags":["Newsletter"],"summary":"Set Subscription","operationId":"set_subscription_api_newsletter_subscription_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_subscription_api_newsletter_subscription_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connectors/cli":{"post":{"tags":["connectors"],"summary":"Connectors Cli","description":"Run one connectors CLI command server-side for the caller.\n\n``save`` names output fields that hold a whole downloaded file (base64);\nthey come back beside stdout, uncapped, for the CLI to write to disk.\n\n``full`` returns a run's whole output uncapped: `--save-df` turns all of\nit into a table, not the first 30,000 characters.\n\n``files`` carries whole-file arguments: an upload's base64 content, keyed\nby the action argument it belongs to. They travel here rather than in\n``argv`` because a real document exceeds ``_MAX_CLI_ARG_LEN`` as base64\nlong before it is large enough to be interesting, and an agent that cannot\npass one resorts to shrinking the file until it fits.","operationId":"connectors_cli_api_connectors_cli_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connectors_cli_api_connectors_cli_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Connectors Cli Api Connectors Cli Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/personal_connectors":{"get":{"tags":["personal_connectors"],"summary":"List Personal Connectors","description":"The current user's connector catalog: what the org allows, with this\nuser's connection state per entry.","operationId":"list_personal_connectors_api_personal_connectors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Personal Connectors Api Personal Connectors Get"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/personal_connectors/{slug}/connect":{"post":{"tags":["personal_connectors"],"summary":"Connect Personal Connector","operationId":"connect_personal_connector_api_personal_connectors__slug__connect_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Connect Personal Connector Api Personal Connectors  Slug  Connect Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/personal_connectors/logo/{slug}":{"get":{"tags":["personal_connectors"],"summary":"Personal Connector Logo","description":"Same-origin brand logos: the production CSP allows img-src 'self' only,\nso the (now self-hosted, not third-party) logo source is proxied. Public\n(brand images, no user data), slug-validated against the catalog, never a\nfree path segment into Nango.","operationId":"personal_connector_logo_api_personal_connectors_logo__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/personal_connectors/nango_webhook":{"post":{"tags":["personal_connectors"],"summary":"Nango Webhook","description":"Server-to-server notification from our self-hosted Nango instance that\na connect session settled (success or failure). Unauthenticated by\nFastAPI's normal auth — identity and integrity come entirely from the\nHMAC signature in ``X-Nango-Hmac-Sha256``, verified against the per-\nenvironment webhook signing key. Never trust an unsigned or mis-signed\nbody: that would let anyone who finds this URL fabricate a connection.","operationId":"nango_webhook_api_personal_connectors_nango_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Nango Webhook Api Personal Connectors Nango Webhook Post"}}}}}}},"/api/personal_connectors/confirmations/{confirmation_id}":{"get":{"tags":["personal_connectors"],"summary":"Preview Personal Action","operationId":"preview_personal_action_api_personal_connectors_confirmations__confirmation_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"confirmation_id","in":"path","required":true,"schema":{"type":"string","title":"Confirmation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Preview Personal Action Api Personal Connectors Confirmations  Confirmation Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/personal_connectors/confirmations/{confirmation_id}/approve":{"post":{"tags":["personal_connectors"],"summary":"Approve Personal Action","operationId":"approve_personal_action_api_personal_connectors_confirmations__confirmation_id__approve_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"confirmation_id","in":"path","required":true,"schema":{"type":"string","title":"Confirmation Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_approve_personal_action_api_personal_connectors_confirmations__confirmation_id__approve_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Approve Personal Action Api Personal Connectors Confirmations  Confirmation Id  Approve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/personal_connectors/cli":{"post":{"tags":["personal_connectors"],"summary":"Connectors Cli","description":"Run one connectors CLI command server-side for the caller.\n\n``save`` names output fields that hold a whole downloaded file (base64);\nthey come back beside stdout, uncapped, for the CLI to write to disk.\n\n``full`` returns a run's whole output uncapped: `--save-df` turns all of\nit into a table, not the first 30,000 characters.\n\n``files`` carries whole-file arguments: an upload's base64 content, keyed\nby the action argument it belongs to. They travel here rather than in\n``argv`` because a real document exceeds ``_MAX_CLI_ARG_LEN`` as base64\nlong before it is large enough to be interesting, and an agent that cannot\npass one resorts to shrinking the file until it fits.","operationId":"connectors_cli_api_personal_connectors_cli_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connectors_cli_api_personal_connectors_cli_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Connectors Cli Api Personal Connectors Cli Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/personal_connectors/{slug}/disconnect":{"post":{"tags":["personal_connectors"],"summary":"Disconnect Personal Connector","description":"Sever the caller's own connection. Never feature-gated: even when an\nadmin has turned the feature off, users can still take their access back.\n\nThe mirror row is deleted only after Nango confirms the connection is\ngone — it's Dot's only pointer to the grant, so deleting it on a vendor\noutage would leave a live token nobody could ever revoke.","operationId":"disconnect_personal_connector_api_personal_connectors__slug__disconnect_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Disconnect Personal Connector Api Personal Connectors  Slug  Disconnect Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/personal_connectors/overview":{"get":{"tags":["personal_connectors"],"summary":"Personal Connectors Overview","description":"Admin view: the full catalog with per-connector disabled state and who\nhas connected what.","operationId":"personal_connectors_overview_api_personal_connectors_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Personal Connectors Overview Api Personal Connectors Overview Get"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/personal_connectors/request":{"post":{"tags":["personal_connectors"],"summary":"Request Personal Connector","description":"\"Missing a tool?\" on Profile → Connectors: emails the team what the\nperson asked for, in their own words.","operationId":"request_personal_connector_api_personal_connectors_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_request_personal_connector_api_personal_connectors_request_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Request Personal Connector Api Personal Connectors Request Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/personal_connectors/set_disabled":{"post":{"tags":["personal_connectors"],"summary":"Set Disabled Personal Connectors","operationId":"set_disabled_personal_connectors_api_personal_connectors_set_disabled_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_disabled_personal_connectors_api_personal_connectors_set_disabled_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Set Disabled Personal Connectors Api Personal Connectors Set Disabled Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/personal_connectors/set_write_enabled":{"post":{"tags":["personal_connectors"],"summary":"Set Write Enabled Personal Connector","description":"Allow or revoke WRITE actions (send, create, delete, …) for one\nconnector. Reads follow the allow/deny list; writes are opt-in and the\nbroker enforces this on every `run`.","operationId":"set_write_enabled_personal_connector_api_personal_connectors_set_write_enabled_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_write_enabled_personal_connector_api_personal_connectors_set_write_enabled_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Set Write Enabled Personal Connector Api Personal Connectors Set Write Enabled Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/personal_connectors/admin_disconnect":{"post":{"tags":["personal_connectors"],"summary":"Admin Disconnect Personal Connector","description":"Admin revokes another user's connection (full-control requirement).","operationId":"admin_disconnect_personal_connector_api_personal_connectors_admin_disconnect_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_admin_disconnect_personal_connector_api_personal_connectors_admin_disconnect_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin Disconnect Personal Connector Api Personal Connectors Admin Disconnect Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/mcp_connectors/save":{"post":{"tags":["MCP connectors"],"summary":"Save Mcp Connector","description":"Create or update a connector, loading its tools. Nothing is saved if the server can't be reached.","operationId":"save_mcp_connector_api_mcp_connectors_save_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_save_mcp_connector_api_mcp_connectors_save_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Save Mcp Connector Api Mcp Connectors Save Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/mcp_connectors/{connection_id}":{"get":{"tags":["MCP connectors"],"summary":"Get Mcp Connector","operationId":"get_mcp_connector_api_mcp_connectors__connection_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Mcp Connector Api Mcp Connectors  Connection Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp_connectors/{connection_id}/refresh":{"post":{"tags":["MCP connectors"],"summary":"Refresh Mcp Connector","description":"Reload the tool list. A tool whose definition changed is switched off until reviewed.","operationId":"refresh_mcp_connector_api_mcp_connectors__connection_id__refresh_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Refresh Mcp Connector Api Mcp Connectors  Connection Id  Refresh Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp_connectors/{connection_id}/tool":{"post":{"tags":["MCP connectors"],"summary":"Set Mcp Connector Tool","description":"Enable or disable one tool, or mark it read-only.","operationId":"set_mcp_connector_tool_api_mcp_connectors__connection_id__tool_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_mcp_connector_tool_api_mcp_connectors__connection_id__tool_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Mcp Connector Tool Api Mcp Connectors  Connection Id  Tool Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/oembed":{"get":{"tags":["oembed"],"summary":"Oembed","description":"oEmbed provider endpoint. Returns embed metadata for a Dot share URL.\n\nSupports the JSON format only; per the spec, an unsupported `format` yields\n501. The `url` must point at one of Dot's own hosts, or we 404 (no open\nproxy). Gating and cache headers mirror the underlying share page.","operationId":"oembed_api_oembed_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"The Dot share URL to embed","title":"Url"},"description":"The Dot share URL to embed"},{"name":"maxwidth","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4000,"minimum":1},{"type":"null"}],"title":"Maxwidth"}},{"name":"maxheight","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4000,"minimum":1},{"type":"null"}],"title":"Maxheight"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"json","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/oembed/thumb/{kind}/{rid}.png":{"get":{"tags":["oembed"],"summary":"Oembed Thumbnail","operationId":"oembed_thumbnail_api_oembed_thumb__kind___rid__png_get","parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}},{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/replication/sources":{"get":{"tags":["Replication"],"summary":"List available replication source types","description":"Return the offered sources, plus any the org already replicates so a\nsource that left the offered list keeps a working card.","operationId":"list_sources_api_replication_sources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/replication/connect":{"post":{"tags":["Replication"],"summary":"Connect a new replication source","description":"Provision DWH tenant, create config, trigger first sync.\n\nUser-chosen fetch targets are preflighted before storage and revalidated\nfrom the complete decrypted row at worker dispatch time.","operationId":"connect_source_api_replication_connect_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_source_api_replication_connect_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/replication/limits":{"get":{"tags":["Replication"],"summary":"What the workspace's plan allows","description":"Source and schedule limits, for the cards to show before a write is refused.","operationId":"get_limits_api_replication_limits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/replication/status":{"get":{"tags":["Replication"],"summary":"Get replication status for all sources","description":"Return all replication configs with their sync status.","operationId":"get_status_api_replication_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/replication/{config_id}/sync":{"post":{"tags":["Replication"],"summary":"Trigger a manual sync","description":"Manually trigger a replication sync for a specific config.","operationId":"trigger_sync_api_replication__config_id__sync_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"string","title":"Config Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_trigger_sync_api_replication__config_id__sync_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/replication/{config_id}/account":{"post":{"tags":["Replication"],"summary":"Choose which account a connection syncs","description":"Switch an OAuth connection (Google Ads) to another account its login reaches.\n\nThe new account loads from the start: a full refresh drops the previous\naccount's rows, which a merge would keep beside the new ones. Should that\nreload not finish, the next sync reloads anyway, because the replicator\nrecords which account the tables were loaded from. A switch whose reload\ncannot be queued is undone, so the card never shows an account that is\nnot loading.","operationId":"choose_account_api_replication__config_id__account_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"string","title":"Config Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_choose_account_api_replication__config_id__account_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/replication/{config_id}":{"put":{"tags":["Replication"],"summary":"Update replication config","description":"Update schedule, enable/disable, or rotate credentials.\n\nCredential rotation re-encrypts the stored secret blob in place; the\nconfig keeps its id and sync history. The next scheduled sync will use\nthe new credentials; the user can also click Sync Now to validate\nimmediately.","operationId":"update_config_api_replication__config_id__put","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"string","title":"Config Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_update_config_api_replication__config_id__put"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Replication"],"summary":"Delete a replication source","description":"Remove a replication config. Does not delete data already in the DWH.","operationId":"delete_source_api_replication__config_id__delete","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"string","title":"Config Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/oidc/.well-known/openid-configuration":{"get":{"tags":["Secret Stores"],"summary":"Openid Configuration","operationId":"openid_configuration_api_oidc__well_known_openid_configuration_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/oidc/jwks":{"get":{"tags":["Secret Stores"],"summary":"Openid Jwks","operationId":"openid_jwks_api_oidc_jwks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/secret_stores":{"get":{"tags":["Secret Stores"],"summary":"List Secret Stores","operationId":"list_secret_stores_api_secret_stores_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/secret_stores/save":{"post":{"tags":["Secret Stores"],"summary":"Save Secret Store","operationId":"save_secret_store_api_secret_stores_save_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_save_secret_store_api_secret_stores_save_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/secret_stores/test":{"post":{"tags":["Secret Stores"],"summary":"Test Secret Store","operationId":"test_secret_store_api_secret_stores_test_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_test_secret_store_api_secret_stores_test_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/secret_stores/keys":{"post":{"tags":["Secret Stores"],"summary":"Secret Store Keys","description":"Key names of a secret, for picking which one a field uses. Never returns values.","operationId":"secret_store_keys_api_secret_stores_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_secret_store_keys_api_secret_stores_keys_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/secret_stores/delete":{"post":{"tags":["Secret Stores"],"summary":"Delete Secret Store","operationId":"delete_secret_store_api_secret_stores_delete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_delete_secret_store_api_secret_stores_delete_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/wishes":{"post":{"tags":["wishes"],"summary":"Create Wish","operationId":"create_wish_api_wishes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWishRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/platform_admin/orgs":{"get":{"tags":["Platform Admin"],"summary":"List Orgs","description":"List orgs on this region.\n\nDefault filter: ``plan_tier != \"free\"`` (paying customers only). Use\n``?include_free=true`` to include free orgs.\n\nWorkspaces are collapsed server-side: each top-level org gets a\n``workspaces`` list containing its child workspace orgs, so the panel\nsees one row per parent org.","operationId":"list_orgs_api_platform_admin_orgs_get","parameters":[{"name":"include_free","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Free"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Orgs Api Platform Admin Orgs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/platform_admin/orgs/{org_id}":{"get":{"tags":["Platform Admin"],"summary":"Get Org Detail","description":"Full usage + billing snapshot for one org.\n\nTop-level keys are *effective* values — what billing will actually do today.\n``config`` carries the same fields as *stored*, so a caller can tell a\ndeliberate setting from an inherited plan default and read back what it\nwrote. See :func:`_config_as_set`.","operationId":"get_org_detail_api_platform_admin_orgs__org_id__get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Org Detail Api Platform Admin Orgs  Org Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/platform_admin/audit_log":{"get":{"tags":["Platform Admin"],"summary":"Get Audit Log","description":"Recent audit rows on this region, newest first.","operationId":"get_audit_log_api_platform_admin_audit_log_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"org_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Audit Log Api Platform Admin Audit Log Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/platform_admin/orgs/{org_id}/plan_tier":{"post":{"tags":["Platform Admin"],"summary":"Set Plan Tier","description":"Override an org's plan tier (does not touch Stripe).","operationId":"set_plan_tier_api_platform_admin_orgs__org_id__plan_tier_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_plan_tier_api_platform_admin_orgs__org_id__plan_tier_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Plan Tier Api Platform Admin Orgs  Org Id  Plan Tier Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/platform_admin/orgs/{org_id}/credits":{"post":{"tags":["Platform Admin"],"summary":"Set Credits","description":"Set per-org custom credit limit, cycle length and/or cycle anchor.\n\nOnly fields present in the request body are updated. Explicit null reverts\nthat field to the plan default — except ``credits_cycle_start``, which has no\nplan default and cannot be cleared.\n\n``credits_override = 0`` means **no credit allowance**, and is a different\nstate from null (unlimited, or the plan default). It is the honest way to\nexpress a wound-down or suspended account: with overage off the org blocks\nimmediately, and with overage on every credit is metered at the contracted\nrate from the first one. Previously the minimum was 1, so \"blocked\" had to be\napproximated by a 1-credit allowance — which only holds while ``credits_used``\nhappens to exceed it, and silently grants a credit the moment a cycle rolls\nover. Support bonus credits still add on top, so an org set to 0 with a\nstanding grant is not blocked; clear the grant as well if that is the intent.\n\n``credits_cycle_start`` **re-anchors** the current window: it moves the start\ndate and nothing else. No overage is billed and ``credits_used`` /\n``overage_spend_dollars`` are left alone. Use ``reset_credits`` for the other\nintent — closing out a cycle (bill, zero, restart).","operationId":"set_credits_api_platform_admin_orgs__org_id__credits_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_SetCreditsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Credits Api Platform Admin Orgs  Org Id  Credits Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/platform_admin/orgs/{org_id}/bonus_credits":{"post":{"tags":["Platform Admin"],"summary":"Grant Bonus Credits","description":"Grant support bonus credits, kept separate from reward-earned credits.\n\n`mode=\"add\"` (default) adds to the existing support bonus; `mode=\"set\"` replaces\nit. Reward-earned credits (the `credit_rewards` ledger) are never touched, so a\ngrant can no longer overwrite credits a customer earned through engagement.","operationId":"grant_bonus_credits_api_platform_admin_orgs__org_id__bonus_credits_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_grant_bonus_credits_api_platform_admin_orgs__org_id__bonus_credits_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Grant Bonus Credits Api Platform Admin Orgs  Org Id  Bonus Credits Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/platform_admin/orgs/{org_id}/credits_used":{"post":{"tags":["Platform Admin"],"summary":"Set Credits Used","description":"Correct the cycle usage counter, either to a stated figure or from the usage log.\n\n``credits_used`` is otherwise forward-only: it is incremented per query and\nzeroed only by a cycle close-out. That makes a backdated\n``credits_cycle_start`` mean something different from what it reads as: the\nwindow moves, the counter does not, so the org carries pre-window usage into\nthe new allowance. Aligning a cycle to a contract date previously required\neither accepting that, or running ``reset_credits`` and destroying the usage\nrecord you were trying to bill for.\n\nTwo modes, and ``recompute`` is the one to prefer:\n\n* ``recompute: true``: recount from the per-event usage log since the\n  anchor (see :func:`recompute_credits_used`), across the org and its\n  workspaces. This makes a backdated anchor mean what a reader assumes it\n  means, and the number is derived rather than asserted.\n* ``credits_used: <n>``: write a stated figure. For cases the log cannot\n  answer, e.g. usage agreed with a customer out of band.\n\n``dry_run`` returns what would be written without writing the counter, so the\nchange can be shown before it is made. ``reason`` is required for a real write:\nthis is a billing counter, and a bare number in the audit log with no stated why\nis not auditable.\n\nA recompute refuses (409) when it cannot stand behind its own total: an\nunreadable usage log, a query straddling the anchor whose spend the window\ndrops, a billed event still pending persistence, or usage recorded while the\ntotal was being computed. ``force`` writes it anyway. A billed row that reached\ndisk but not the usage log (its writer died with its process) is written there\nfirst, dry run included, so it is counted rather than refused and the dry run\nshows the total the write would apply. A usage log that cannot be opened is\nleft untouched, so it still refuses.\n\n``overage_spend_dollars`` is recomputed with the counter. The two are one\nfact: leaving the old spend behind invoices overage on credits this call just\nestablished were never consumed.","operationId":"set_credits_used_api_platform_admin_orgs__org_id__credits_used_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_SetCreditsUsedBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Credits Used Api Platform Admin Orgs  Org Id  Credits Used Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/platform_admin/orgs/{org_id}/overage":{"post":{"tags":["Platform Admin"],"summary":"Set Overage","description":"Toggle overage billing and set its cap, per-credit rate and currency.\n\n`rate_dollars` overrides the plan-default overage rate (used for contracted\nEnterprise rates). Omitting the field leaves any previously-set rate\nunchanged (same merge behaviour as `cap_dollars`); the plan default only\napplies when no rate has ever been persisted. To clear a previously-set\nrate, drop the field directly via SQL — there's no clear-via-API path yet,\nmatching the existing convention for `cap_dollars`.\n\n`currency` (ISO 4217) denominates the rate, the cap and the accrued spend —\nthey are all the same unit, so nothing is ever converted; only the Stripe\ninvoice's currency changes. Defaults to USD when never set.\n\nEvery stored amount is a bare number, so *changing* the currency relabels them\nrather than converting them. Two rejections follow from that, and both apply in\neither direction — into a non-USD currency and back out to USD:\n\n- A switch must carry `rate_dollars`, and `cap_dollars` when a cap is set, both\n  denominated in the new currency. Keeping the old numbers would apply a EUR 1.20\n  contract as GBP 1.20 and quietly move the spend the customer authorised.\n- A switch is refused while the cycle has unsettled `overage_spend_dollars`, which\n  would otherwise be invoiced in the new currency. Settle it with `reset_credits`.\n\nSeparately, a non-USD currency always needs a contracted rate: the plan defaults\nare USD list prices and would be invoiced at face value in the org's currency.","operationId":"set_overage_api_platform_admin_orgs__org_id__overage_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_overage_api_platform_admin_orgs__org_id__overage_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Overage Api Platform Admin Orgs  Org Id  Overage Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/platform_admin/orgs/{org_id}/grandfathered":{"post":{"tags":["Platform Admin"],"summary":"Set Grandfathered","description":"Set or clear the grandfathered flag. Grandfathering also sets Enterprise tier.","operationId":"set_grandfathered_api_platform_admin_orgs__org_id__grandfathered_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_grandfathered_api_platform_admin_orgs__org_id__grandfathered_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Grandfathered Api Platform Admin Orgs  Org Id  Grandfathered Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/platform_admin/orgs/{org_id}/reset_credits":{"post":{"tags":["Platform Admin"],"summary":"Reset Credits","description":"Force a new billing cycle.\n\nOptional ``cycle_start`` is an ISO-8601 timestamp; when omitted we use now.\nAccepts both ``...Z`` and ``...+00:00`` forms — normalised through\n:func:`datetime.fromisoformat` before validation.\n\nThis bills accrued overage and zeroes the usage counters. To move the window\nwithout either side effect, set ``credits_cycle_start`` via ``/credits``.","operationId":"reset_credits_api_platform_admin_orgs__org_id__reset_credits_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_ResetCreditsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reset Credits Api Platform Admin Orgs  Org Id  Reset Credits Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/platform_admin/orgs/{org_id}/disable":{"post":{"tags":["Platform Admin"],"summary":"Set Org Disabled","description":"Deactivate (or reactivate) an org and every workspace under it.\n\n`org[\"disable\"]` gates login, chat, schedulers, syncs, newsletters and\ndigests, so this is the churn switch: no data is destroyed and flipping\n`disabled=false` restores the account. Child workspaces are stamped too —\nmost read sites check only the org's own row, so a parent-only flag would\nleave `acme.com-w-dev` reachable.","operationId":"set_org_disabled_api_platform_admin_orgs__org_id__disable_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_set_org_disabled_api_platform_admin_orgs__org_id__disable_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Org Disabled Api Platform Admin Orgs  Org Id  Disable Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/platform_admin/orgs/{org_id}/rewards/{reward_type}":{"post":{"tags":["Platform Admin"],"summary":"Grant Reward Endpoint","description":"Grant an engagement reward (call=+50, linkedin=+200, case_study=+500).","operationId":"grant_reward_endpoint_api_platform_admin_orgs__org_id__rewards__reward_type__post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"reward_type","in":"path","required":true,"schema":{"type":"string","title":"Reward Type"}},{"name":"Authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Grant Reward Endpoint Api Platform Admin Orgs  Org Id  Rewards  Reward Type  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/train/parse_csv_preview":{"post":{"tags":["train"],"summary":"Parse Csv Preview","operationId":"parse_csv_preview_api_train_parse_csv_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_parse_csv_preview_api_train_parse_csv_preview_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Parse Csv Preview Api Train Parse Csv Preview Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/train/trainings/{training_id}/attach_chat":{"post":{"tags":["train"],"summary":"Attach Training Chat","operationId":"attach_training_chat_api_train_trainings__training_id__attach_chat_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"path","required":true,"schema":{"type":"string","title":"Training Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Attach Training Chat Api Train Trainings  Training Id  Attach Chat Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/train/interview_chat":{"post":{"tags":["train"],"summary":"Create Interview Chat","operationId":"create_interview_chat_api_train_interview_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_create_interview_chat_api_train_interview_chat_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Interview Chat Api Train Interview Chat Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/train/trainings":{"post":{"tags":["train"],"summary":"Create Training","operationId":"create_training_api_train_trainings_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Training Api Train Trainings Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["train"],"summary":"List Trainings","operationId":"list_trainings_api_train_trainings_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Trainings Api Train Trainings Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/train/trainings/{training_id}":{"get":{"tags":["train"],"summary":"Get Training","operationId":"get_training_api_train_trainings__training_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"path","required":true,"schema":{"type":"string","title":"Training Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Training Api Train Trainings  Training Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["train"],"summary":"Update Training","operationId":"update_training_api_train_trainings__training_id__put","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"path","required":true,"schema":{"type":"string","title":"Training Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Training Api Train Trainings  Training Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["train"],"summary":"Archive Training","operationId":"archive_training_api_train_trainings__training_id__delete","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"path","required":true,"schema":{"type":"string","title":"Training Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Archive Training Api Train Trainings  Training Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/train/trainings/{training_id}/proposal":{"post":{"tags":["train"],"summary":"Create Training Proposal","operationId":"create_training_proposal_api_train_trainings__training_id__proposal_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"path","required":true,"schema":{"type":"string","title":"Training Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_create_training_proposal_api_train_trainings__training_id__proposal_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Training Proposal Api Train Trainings  Training Id  Proposal Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/train/trainings/{training_id}/report":{"get":{"tags":["train"],"summary":"Get Training Report","operationId":"get_training_report_api_train_trainings__training_id__report_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"path","required":true,"schema":{"type":"string","title":"Training Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/train/trainings/{training_id}/report/regenerate":{"post":{"tags":["train"],"summary":"Regenerate Training Report","operationId":"regenerate_training_report_api_train_trainings__training_id__report_regenerate_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"path","required":true,"schema":{"type":"string","title":"Training Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Regenerate Training Report Api Train Trainings  Training Id  Report Regenerate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/train/trainings/{training_id}/questions":{"get":{"tags":["train"],"summary":"List Questions","operationId":"list_questions_api_train_trainings__training_id__questions_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"path","required":true,"schema":{"type":"string","title":"Training Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Questions Api Train Trainings  Training Id  Questions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/train/trainings/{training_id}/journal/entries":{"post":{"tags":["train"],"summary":"Append Journal Entry","operationId":"append_journal_entry_api_train_trainings__training_id__journal_entries_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"path","required":true,"schema":{"type":"string","title":"Training Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppendJournalEntryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Append Journal Entry Api Train Trainings  Training Id  Journal Entries Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["train"],"summary":"List Journal Entries","operationId":"list_journal_entries_api_train_trainings__training_id__journal_entries_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"path","required":true,"schema":{"type":"string","title":"Training Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Journal Entries Api Train Trainings  Training Id  Journal Entries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/train/trainings/{training_id}/stream":{"get":{"tags":["train"],"summary":"Stream Training","operationId":"stream_training_api_train_trainings__training_id__stream_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"path","required":true,"schema":{"type":"string","title":"Training Id"}},{"name":"after","in":"query","required":false,"schema":{"type":"string","default":"","title":"After"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/train/trainings/{training_id}/versions":{"get":{"tags":["train"],"summary":"List Versions","operationId":"list_versions_api_train_trainings__training_id__versions_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"path","required":true,"schema":{"type":"string","title":"Training Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Versions Api Train Trainings  Training Id  Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/train/versions/{version_id}":{"get":{"tags":["train"],"summary":"Get Version","operationId":"get_version_api_train_versions__version_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Version Api Train Versions  Version Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/train/trainings/{training_id}/run":{"post":{"tags":["train"],"summary":"Start Run For Training","operationId":"start_run_for_training_api_train_trainings__training_id__run_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"path","required":true,"schema":{"type":"string","title":"Training Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartTrainingRunRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Start Run For Training Api Train Trainings  Training Id  Run Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/train/runs":{"post":{"tags":["train"],"summary":"Create Run","operationId":"create_run_api_train_runs_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartTrainingRunRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Run Api Train Runs Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["train"],"summary":"List Runs","operationId":"list_runs_api_train_runs_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"training_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Id"}},{"name":"source_chat_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Chat Id"}},{"name":"active_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Active Only"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Runs Api Train Runs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/train/runs/{run_id}":{"get":{"tags":["train"],"summary":"Get Run","operationId":"get_run_api_train_runs__run_id__get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Run Api Train Runs  Run Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/train/runs/{run_id}/cancel":{"post":{"tags":["train"],"summary":"Cancel Run","operationId":"cancel_run_api_train_runs__run_id__cancel_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Run Api Train Runs  Run Id  Cancel Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/train/runs/{run_id}/resume":{"post":{"tags":["train"],"summary":"Resume Run","operationId":"resume_run_api_train_runs__run_id__resume_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ResumeTrainingRunRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Resume Run Api Train Runs  Run Id  Resume Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/train/runs/{run_id}/discussion_chat":{"post":{"tags":["train"],"summary":"Discussion Chat","operationId":"discussion_chat_api_train_runs__run_id__discussion_chat_post","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Discussion Chat Api Train Runs  Run Id  Discussion Chat Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/train/runs/{run_id}/stream":{"get":{"tags":["train"],"summary":"Stream Run","operationId":"stream_run_api_train_runs__run_id__stream_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","title":"Run Id"}},{"name":"after","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"After"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/train/trainings/{training_id}/logs":{"get":{"tags":["train"],"summary":"Get Training Logs","operationId":"get_training_logs_api_train_trainings__training_id__logs_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"training_id","in":"path","required":true,"schema":{"type":"string","title":"Training Id"}},{"name":"run_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Run Id"}},{"name":"after","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"After"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":5000,"title":"Limit"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(milestone|detail)$"},{"type":"null"}],"title":"Kind"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Training Logs Api Train Trainings  Training Id  Logs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/extract_tableau_view":{"post":{"tags":["tableau"],"summary":"Extract Tableau View","description":"Extract exact values from a Tableau view via the Connected App (JWT).\n\nSelf-describing for the context agent / Train / external callers:\n- describe_only, no connection_id -> list this org's Tableau connections with\n  {id, url, site_id, has_pat, has_jwt, sandbox_credentials} so the caller learns\n  what's activated and which row its own TABLEAU_* env vars belong to.\n- describe_only + connection_id, no view -> that connection's {has_pat, has_jwt}.\n- describe_only + a view -> {worksheets, filters, parameters} for discovery.\n- capture_evidence -> one same-session bundle containing controls, visual\n  specifications, exact values, and the JWT-authenticated rendered image.\n- otherwise -> {worksheets:[{name, columns, rows:[[{value, formatted_value}]]}]}.\n\nIdentify a view by `view_id`/`view_name` (resolved to a contentUrl over PAT)\nor pass `view_content_url` directly to skip resolution (cheaper, and works on\nJWT-only connections). Exact-value paths require Connected App (JWT) creds;\nwithout them returns 409 so the caller falls back to the PAT catalog.","operationId":"extract_tableau_view_api_extract_tableau_view_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_extract_tableau_view_api_extract_tableau_view_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/tableau_extraction_status":{"post":{"tags":["tableau"],"summary":"Tableau Extraction Status","description":"Poll an async extraction started with `async_job=True`.\n\nReturns `{status}` while queued/running and adds `result` or `error` once\nterminal. Only the user who initiated an extraction can read its result, and\nonly while they still have access to the Tableau skill — a job outlives the\nscope an admin narrows, and its result is the data that scope protects.","operationId":"tableau_extraction_status_api_tableau_extraction_status_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_tableau_extraction_status_api_tableau_extraction_status_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/tableau_workbook_views":{"post":{"tags":["tableau"],"summary":"Tableau Workbook Views","description":"Enumerate a workbook's views over the connection's stored PAT.\n\nGiven a connection and a workbook LUID, return every sheet as\n[{view_id, name, content_url}], so a caller who only knows the workbook can\ndiscover its views and then extract one by id/content_url. Needs only PAT\n(no Connected App JWT, no browser). `workbook_id` is a Tableau LUID; a plain\nnumeric UI id is resolved best-effort via the Metadata API, and a 400 is\nreturned if it can't be translated. PAT-only: 409 if none configured.","operationId":"tableau_workbook_views_api_tableau_workbook_views_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_tableau_workbook_views_api_tableau_workbook_views_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/tableau_metadata_graphql":{"post":{"tags":["tableau"],"summary":"Tableau Metadata Graphql","description":"Run a raw Tableau Metadata API GraphQL query over the connection's stored\nPAT and pass the result back as {success, data, errors}. For lineage,\nimpact analysis, and id translation. PAT-only: 409 if none configured.","operationId":"tableau_metadata_graphql_api_tableau_metadata_graphql_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_tableau_metadata_graphql_api_tableau_metadata_graphql_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/validate_tableau_connected_app":{"post":{"tags":["tableau"],"summary":"Validate Tableau Connected App","description":"Probe a connection's Connected App (JWT): sign a token, try candidate\nviews via the Embedding API, and report whether Tableau accepted it — to the\nlogs drawer. Read-only against Tableau. Always returns 200 with a result so\nthe caller can render the log; failures are reported, not raised.\n\nPass `view_content_url` to probe a known-good view deterministically; without\nit up to five recently updated workbooks are tried (which needs PAT to\nenumerate).","operationId":"validate_tableau_connected_app_api_validate_tableau_connected_app_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_validate_tableau_connected_app_api_validate_tableau_connected_app_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/looker_cli":{"post":{"tags":["looker"],"summary":"Looker Cli","description":"Run one gated Looker CLI command server-side under the caller's identity.","operationId":"looker_cli_api_looker_cli_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_looker_cli_api_looker_cli_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/powerbi_cli":{"post":{"tags":["powerbi"],"summary":"Powerbi Cli","description":"Run one gated Power BI CLI command server-side under the caller's identity.","operationId":"powerbi_cli_api_powerbi_cli_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_powerbi_cli_api_powerbi_cli_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/connect_drive":{"post":{"tags":["drive"],"summary":"Connect Drive","description":"Connect one Google Drive scope.\n\n**shared** (default): the service account acts as itself and reads exactly\nthe shared drive it was added to. One connection per drive, each with its own\naccess groups, so \"Finance sees the Finance drive\" is enforced by Google\nhanding out a credential that cannot read anything else.\n\n**delegated**: domain-wide delegation, impersonating whoever asks. Every user\nsees their own Drive. Needs the Admin console authorization step, and the key\ncan read any file in the domain — right for some companies, which is why it\nstays available.\n\nEither way the connection is verified against Google before it is saved: a\nmisconfigured one would otherwise look successful and then fail on every\nagent call with an error no one can act on.","operationId":"connect_drive_api_connect_drive_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_connect_drive_api_connect_drive_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/drive_cli":{"post":{"tags":["drive"],"summary":"Drive Cli","description":"Run one gated Drive CLI command server-side under the caller's identity.","operationId":"drive_cli_api_drive_cli_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_drive_cli_api_drive_cli_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/snowflake_marketplace_cli":{"post":{"tags":["snowflake_marketplace"],"summary":"Snowflake Marketplace Cli","description":"Run one Snowflake Internal Marketplace lookup against the mirrored catalog.","operationId":"snowflake_marketplace_cli_api_snowflake_marketplace_cli_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_snowflake_marketplace_cli_api_snowflake_marketplace_cli_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/rls_attributes/validate":{"post":{"tags":["rls_attributes"],"summary":"Validate Rls Policy","description":"Check an unsaved policy against the real, workspace-scoped warehouse table.","operationId":"validate_rls_policy_api_rls_attributes_validate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RlsValidationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Validate Rls Policy Api Rls Attributes Validate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/rls_attributes":{"get":{"tags":["rls_attributes"],"summary":"List Rls Attributes","description":"Attribute definitions for the rule editor. Values are admin-only and are\nnot part of this response.","operationId":"list_rls_attributes_api_rls_attributes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Rls Attributes Api Rls Attributes Get"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/rls_attributes/upsert":{"post":{"tags":["rls_attributes"],"summary":"Upsert Rls Attribute","description":"Adjust policy on an existing definition — the default-value opt-in and the\nmaximum age. Definitions themselves only ever come from the Looker sync.","operationId":"upsert_rls_attribute_api_rls_attributes_upsert_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_upsert_rls_attribute_api_rls_attributes_upsert_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Upsert Rls Attribute Api Rls Attributes Upsert Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/rls_attributes/values":{"get":{"tags":["rls_attributes"],"summary":"Get Rls Attribute Values","description":"How many users carry a Looker-synced value for one attribute.","operationId":"get_rls_attribute_values_api_rls_attributes_values_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Rls Attribute Values Api Rls Attributes Values Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rls_attributes/looker_sync_status":{"get":{"tags":["rls_attributes"],"summary":"Get Looker Attribute Sync Status","description":"Last import result plus the live mapped/unmapped user counts, so a broken\nsync is diagnosable instead of a mysterious org-wide deny.","operationId":"get_looker_attribute_sync_status_api_rls_attributes_looker_sync_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Looker Attribute Sync Status Api Rls Attributes Looker Sync Status Get"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/api/rls_attributes/preview":{"get":{"tags":["rls_attributes"],"summary":"Preview Rls Attributes","description":"Render one selected user's effective attributes and draft RLS predicate.","operationId":"preview_rls_attributes_api_rls_attributes_preview_get","security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"query","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"doc_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Doc Id"}},{"name":"expression","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expression"}},{"name":"enabled","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Preview Rls Attributes Api Rls Attributes Preview Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rls_attributes/preview_count":{"post":{"tags":["rls_attributes"],"summary":"Preview Rls Count","description":"Render a draft rule, then count rows through the normal secured query path.","operationId":"preview_rls_count_api_rls_attributes_preview_count_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RlsPreviewCountRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Preview Rls Count Api Rls Attributes Preview Count Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"APIKeyHeader":[]},{"APIKeyCookie":[]},{"OAuth2PasswordBearer":[]}]}},"/install.sh":{"get":{"summary":"Install Sh","operationId":"install_sh_install_sh_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/install":{"get":{"summary":"Install Sh","operationId":"install_sh_install_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/install.ps1":{"get":{"summary":"Install Ps1","operationId":"install_ps1_install_ps1_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AlertPreviewRequest":{"properties":{"app_id":{"type":"string","title":"App Id"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"trigger":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Trigger"},"card":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Card"},"every":{"type":"string","title":"Every","default":"daily"},"on":{"anyOf":[{},{"type":"null"}],"title":"On"},"schedule_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule Id"},"params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Params"}},"type":"object","required":["app_id"],"title":"AlertPreviewRequest"},"AnswerQuestionRequest":{"properties":{"tool_use_id":{"type":"string","title":"Tool Use Id"},"answers":{"additionalProperties":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}]},"type":"object","title":"Answers","default":{}},"response":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response"},"skip":{"type":"boolean","title":"Skip","default":false}},"type":"object","required":["tool_use_id"],"title":"AnswerQuestionRequest","description":"Body for POST /chats/{chat_id}/answer_question — the user's selections for\na pending AskUserQuestion call. `answers` maps question text → selected label\n(or list of labels for multiSelect); `response` is a freeform reply when the\nuser typed instead of picking an option; `skip` declines to answer and lets\nthe run continue immediately."},"AppQueryRequest":{"properties":{"build_id":{"type":"string","maxLength":128,"minLength":1,"title":"Build Id"},"param_values":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Param Values"},"overrides":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Overrides"},"refresh":{"type":"boolean","title":"Refresh","default":false},"prefetch":{"type":"boolean","title":"Prefetch","default":false}},"additionalProperties":false,"type":"object","required":["build_id"],"title":"AppQueryRequest","description":"A drill-through names an existing query; it never supplies query text."},"AppRuntimeRequest":{"properties":{"build_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Id"},"param_values":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Param Values"},"refresh":{"type":"boolean","title":"Refresh","default":true},"tabs":{"title":"Tabs"},"stale_first":{"type":"boolean","title":"Stale First","default":false}},"type":"object","title":"AppRuntimeRequest"},"AppSessionQueryRequest":{"properties":{"build_id":{"type":"string","maxLength":128,"minLength":1,"title":"Build Id"},"param_values":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Param Values"},"overrides":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Overrides"},"refresh":{"type":"boolean","title":"Refresh","default":false},"prefetch":{"type":"boolean","title":"Prefetch","default":false},"source_sha256":{"type":"string","pattern":"^[0-9a-f]{64}$","title":"Source Sha256"}},"additionalProperties":false,"type":"object","required":["build_id","source_sha256"],"title":"AppSessionQueryRequest"},"AppViewRow":{"properties":{"app_id":{"type":"string","title":"App Id","description":"ID of the app, as in its link (`/apps/{app_id}`). Moving the app in Dot, or renaming or moving its folder, gives it a new ID, and its views move with it. Renaming the app keeps its ID."},"app_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Title","description":"Title of the app. Null when no app in Production has this ID any more, for example because the app was deleted or exists only in an environment."},"archived":{"type":"boolean","title":"Archived","description":"True when the app is archived: hidden from the Apps list (except under its Archived filter), search and Dot's answers. Its direct links still work for everyone who could open it.","default":false},"viewer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Viewer","description":"Email of the person who opened the app. For workspace users this is suffixed with `#{workspace_name}`, like `user_id` in `/api/export_history`. 'deleted' stands for every user who was deleted, or removed from the workspace, after opening the app. Null on the one row per app that counts visitors through a public share or embed link who were not signed in to this organization: they are counted but not named."},"views":{"type":"integer","title":"Views","description":"How many times this viewer opened the app since `tracking_since`. A view is one open; opens by the same viewer within 15 minutes of their previous open count once, so a dashboard left open on a wall screen is one view. On the public-link row, all of those visitors share one 15-minute window."},"first_viewed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Viewed At","description":"UTC timestamp of this viewer's first open, ISO 8601 format. For 'deleted', the earliest open by any of those users."},"last_viewed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Viewed At","description":"UTC timestamp of this viewer's latest open, ISO 8601 format, including an open within 15 minutes that did not add a view."},"workspace_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Name","description":"Name of the workspace the app belongs to ('Main Workspace' for the main organization). Only populated when the export was requested with `include_all_workspaces=true`."},"workspace_org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Org Id","description":"Org ID of the workspace the app belongs to (e.g. 'getdot.ai-w-cause'). Only populated when the export was requested with `include_all_workspaces=true`."}},"type":"object","required":["app_id","views"],"title":"AppViewRow","description":"One row of the app views export: one person's views of one app, or the\nviews of an app through its public link."},"AppendJournalEntryRequest":{"properties":{"content":{"type":"string","title":"Content"},"kind":{"type":"string","title":"Kind","default":"note"},"agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Id"}},"type":"object","required":["content"],"title":"AppendJournalEntryRequest"},"AttachedFile":{"properties":{"file_id":{"type":"string","title":"File Id"},"original_name":{"type":"string","title":"Original Name"},"path":{"type":"string","title":"Path"},"size":{"type":"integer","title":"Size"}},"type":"object","required":["file_id","original_name","path","size"],"title":"AttachedFile","description":"Model for an attached file in a stream request."},"BlessLockRequest":{"properties":{"queries":{"items":{"type":"string"},"type":"array","title":"Queries","default":[]}},"type":"object","title":"BlessLockRequest"},"Body_aas_connect_service_principal_api_aas_connect_sp_post":{"properties":{"server_url":{"type":"string","title":"Server Url"},"database_name":{"type":"string","title":"Database Name"},"client_id":{"type":"string","title":"Client Id"},"client_secret":{"type":"string","title":"Client Secret"},"tenant_id":{"type":"string","title":"Tenant Id"}},"type":"object","required":["server_url","client_id","client_secret","tenant_id"],"title":"Body_aas_connect_service_principal_api_aas_connect_sp_post"},"Body_aas_oauth_initiate_api_aas_oauth_initiate_post":{"properties":{"server_url":{"type":"string","title":"Server Url"},"database_name":{"type":"string","title":"Database Name"}},"type":"object","required":["server_url"],"title":"Body_aas_oauth_initiate_api_aas_oauth_initiate_post"},"Body_activate_table_fast_route_api_activate_table_fast_post":{"properties":{"table_id":{"type":"string","title":"Table Id"}},"type":"object","required":["table_id"],"title":"Body_activate_table_fast_route_api_activate_table_fast_post"},"Body_activate_table_route_api_activate_table_post":{"properties":{"table_id":{"type":"string","title":"Table Id"}},"type":"object","required":["table_id"],"title":"Body_activate_table_route_api_activate_table_post"},"Body_add_doc_to_group_api_add_doc_to_group_post":{"properties":{"doc_id":{"type":"string","title":"Doc Id"},"group":{"type":"string","title":"Group"}},"type":"object","required":["doc_id","group"],"title":"Body_add_doc_to_group_api_add_doc_to_group_post"},"Body_add_label_to_chat_api_add_label_to_chat_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"labels":{"items":{"type":"string"},"type":"array","title":"Labels"}},"type":"object","required":["chat_id","labels"],"title":"Body_add_label_to_chat_api_add_label_to_chat_post"},"Body_add_user_memory_api_auth_user_memory_post":{"properties":{"memory":{"type":"string","maxLength":2000,"minLength":1,"title":"Memory"}},"type":"object","required":["memory"],"title":"Body_add_user_memory_api_auth_user_memory_post"},"Body_add_user_to_group_api_add_user_to_group_post":{"properties":{"email":{"type":"string","title":"Email"},"group":{"type":"string","title":"Group"}},"type":"object","required":["email","group"],"title":"Body_add_user_to_group_api_add_user_to_group_post"},"Body_add_user_to_workspace_api_add_user_to_workspace_post":{"properties":{"user_email":{"type":"string","title":"User Email","description":"Email of the user to add to workspace"},"workspace_name":{"type":"string","title":"Workspace Name","description":"Name of the workspace"},"role":{"type":"string","title":"Role","description":"Role for the user in the workspace. If not specified, uses workspace's new_user_admin setting."}},"type":"object","required":["user_email","workspace_name"],"title":"Body_add_user_to_workspace_api_add_user_to_workspace_post"},"Body_admin_disconnect_personal_connector_api_personal_connectors_admin_disconnect_post":{"properties":{"user_id":{"type":"string","title":"User Id"},"slug":{"type":"string","title":"Slug"}},"type":"object","required":["user_id","slug"],"title":"Body_admin_disconnect_personal_connector_api_personal_connectors_admin_disconnect_post"},"Body_agentic_api_agentic_post":{"properties":{"messages":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Messages"},"chat_id":{"type":"string","title":"Chat Id"},"skip_check":{"type":"boolean","title":"Skip Check","default":false},"extra":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extra"},"attached_files":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Attached Files"},"eval_mode":{"type":"boolean","title":"Eval Mode","default":false},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"branch":{"type":"string","title":"Branch","default":"main"}},"type":"object","required":["chat_id"],"title":"Body_agentic_api_agentic_post"},"Body_agentic_stream_api_agentic_stream_post":{"properties":{"new_message":{"additionalProperties":true,"type":"object","title":"New Message"},"chat_id":{"type":"string","title":"Chat Id"},"extra":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extra"},"edit_message_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Edit Message Uuid"},"attached_files":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Attached Files"},"eval_mode":{"type":"boolean","title":"Eval Mode","default":false},"report_meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Report Meta"},"lineage_parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lineage Parent Id"},"lineage_source_message_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lineage Source Message Uuid"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"branch":{"type":"string","title":"Branch","default":"main"},"preview":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Preview"}},"type":"object","required":["new_message","chat_id"],"title":"Body_agentic_stream_api_agentic_stream_post"},"Body_agentic_with_history_api_agentic_with_history_post":{"properties":{"new_message":{"additionalProperties":true,"type":"object","title":"New Message"},"chat_id":{"type":"string","title":"Chat Id"},"extra":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extra"},"edit_message_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Edit Message Uuid"},"attached_files":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Attached Files"},"eval_mode":{"type":"boolean","title":"Eval Mode","default":false},"report_meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Report Meta"},"lineage_parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lineage Parent Id"},"lineage_source_message_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lineage Source Message Uuid"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"branch":{"type":"string","title":"Branch","default":"main"}},"type":"object","required":["new_message","chat_id"],"title":"Body_agentic_with_history_api_agentic_with_history_post"},"Body_api_set_app_archived_api_apps__app_id__archive_post":{"properties":{"archived":{"type":"boolean","title":"Archived"}},"type":"object","required":["archived"],"title":"Body_api_set_app_archived_api_apps__app_id__archive_post"},"Body_approve_personal_action_api_personal_connectors_confirmations__confirmation_id__approve_post":{"properties":{"csrf_token":{"type":"string","title":"Csrf Token"}},"type":"object","required":["csrf_token"],"title":"Body_approve_personal_action_api_personal_connectors_confirmations__confirmation_id__approve_post"},"Body_cancel_sampling_endpoint_api_cancel_sampling_post":{"properties":{"table_id":{"type":"string","title":"Table Id","description":"The table ID to cancel processing for"}},"type":"object","required":["table_id"],"title":"Body_cancel_sampling_endpoint_api_cancel_sampling_post"},"Body_change_model_api_change_model_post":{"properties":{"llm_model":{"type":"string","title":"Llm Model"}},"type":"object","required":["llm_model"],"title":"Body_change_model_api_change_model_post"},"Body_change_title_api_change_title_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"title":{"type":"string","title":"Title"}},"type":"object","required":["chat_id","title"],"title":"Body_change_title_api_change_title_post"},"Body_change_user_role_api_change_user_role_post":{"properties":{"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role"}},"type":"object","required":["email","role"],"title":"Body_change_user_role_api_change_user_role_post"},"Body_choose_account_api_replication__config_id__account_post":{"properties":{"customer_id":{"type":"string","title":"Customer Id"}},"type":"object","required":["customer_id"],"title":"Body_choose_account_api_replication__config_id__account_post"},"Body_cli_login_complete_api_auth_cli_login_complete_post":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"Body_cli_login_complete_api_auth_cli_login_complete_post"},"Body_close_chat_session_api_context_agent_chats__chat_id__delete":{"properties":{"confirm":{"type":"boolean","title":"Confirm"}},"type":"object","required":["confirm"],"title":"Body_close_chat_session_api_context_agent_chats__chat_id__delete"},"Body_confluence_cli_api_confluence_cli_post":{"properties":{"argv":{"items":{},"type":"array","title":"Argv"},"connection_id":{"type":"string","title":"Connection Id"}},"type":"object","required":["argv","connection_id"],"title":"Body_confluence_cli_api_confluence_cli_post"},"Body_connect_api_connect_snowflake_post":{"properties":{"account":{"type":"string","title":"Account"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"role":{"type":"string","title":"Role"},"warehouse":{"type":"string","title":"Warehouse"},"private_key":{"type":"string","title":"Private Key"},"private_key_passphrase":{"type":"string","title":"Private Key Passphrase"},"sync_snowflake_roles":{"type":"boolean","title":"Sync Snowflake Roles","default":false},"sync_snowflake_user_roles":{"type":"boolean","title":"Sync Snowflake User Roles","default":false},"use_secondary_roles":{"type":"boolean","title":"Use Secondary Roles","default":false},"internal_marketplace_enabled":{"type":"boolean","title":"Internal Marketplace Enabled","default":false},"secret_refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Secret Refs"}},"type":"object","required":["account","username","role","warehouse"],"title":"Body_connect_api_connect_snowflake_post"},"Body_connect_athena_route_api_connect_athena_post":{"properties":{"region_name":{"type":"string","title":"Region Name"},"aws_access_key_id":{"type":"string","title":"Aws Access Key Id"},"aws_secret_access_key":{"type":"string","title":"Aws Secret Access Key","default":""},"workgroup":{"type":"string","title":"Workgroup","default":"primary"},"output_location":{"type":"string","title":"Output Location"},"secret_refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Secret Refs"}},"type":"object","required":["region_name","aws_access_key_id","output_location"],"title":"Body_connect_athena_route_api_connect_athena_post"},"Body_connect_atlassian_api_api_connect_atlassian_post":{"properties":{"site_url":{"type":"string","title":"Site Url"},"email":{"type":"string","title":"Email"},"api_token":{"type":"string","title":"Api Token"}},"type":"object","required":["site_url","email","api_token"],"title":"Body_connect_atlassian_api_api_connect_atlassian_post"},"Body_connect_bg_api_connect_bigquery_post":{"properties":{"project_id":{"type":"string","title":"Project Id"},"location":{"type":"string","title":"Location"},"credentials_json":{"type":"string","title":"Credentials Json","default":""},"datasets":{"type":"string","title":"Datasets","default":""},"quota_project":{"type":"string","title":"Quota Project","default":""},"impersonate_user":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Impersonate User"},"impersonate_non_sso":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Impersonate Non Sso"},"secret_refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Secret Refs"}},"type":"object","required":["project_id","location"],"title":"Body_connect_bg_api_connect_bigquery_post"},"Body_connect_clickhouse_route_api_connect_clickhouse_post":{"properties":{"host":{"type":"string","title":"Host"},"port":{"type":"integer","title":"Port","default":8443},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password","default":""},"database":{"type":"string","title":"Database","default":""},"secure":{"type":"boolean","title":"Secure","default":true},"verify":{"type":"boolean","title":"Verify","default":true},"ca_cert":{"type":"string","title":"Ca Cert","default":""},"ssh_config":{"additionalProperties":true,"type":"object","title":"Ssh Config","default":{}},"secret_refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Secret Refs"}},"type":"object","required":["host","username"],"title":"Body_connect_clickhouse_route_api_connect_clickhouse_post"},"Body_connect_code_repository_api_api_connect_code_repository_post":{"properties":{"repo_url":{"type":"string","title":"Repo Url"},"branch":{"type":"string","title":"Branch","default":""},"access_token":{"type":"string","title":"Access Token","default":""},"repo_type":{"type":"string","title":"Repo Type","default":"dbt"},"linked_connection_id":{"type":"string","title":"Linked Connection Id","default":""},"auth_mode":{"type":"string","title":"Auth Mode","default":"pat"},"connection_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connection Id"},"secret_refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Secret Refs"}},"type":"object","required":["repo_url"],"title":"Body_connect_code_repository_api_api_connect_code_repository_post"},"Body_connect_cubejs_api_api_connect_cubejs_post":{"properties":{"api_url":{"type":"string","title":"Api Url"},"token":{"type":"string","title":"Token"}},"type":"object","required":["api_url","token"],"title":"Body_connect_cubejs_api_api_connect_cubejs_post"},"Body_connect_dbricks_api_connect_databricks_post":{"properties":{"host":{"type":"string","title":"Host"},"http_path":{"type":"string","title":"Http Path"},"token":{"type":"string","title":"Token","default":""},"port":{"type":"string","title":"Port"},"database":{"type":"string","title":"Database"},"schemas":{"type":"string","title":"Schemas","default":""},"secret_refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Secret Refs"}},"type":"object","required":["host","http_path","port","database"],"title":"Body_connect_dbricks_api_connect_databricks_post"},"Body_connect_dbt_api_api_connect_dbt_post":{"properties":{"region_url":{"type":"string","title":"Region Url","default":"cloud.getdbt.com"},"environment_id":{"type":"string","title":"Environment Id"},"token":{"type":"string","title":"Token"}},"type":"object","required":["environment_id","token"],"title":"Body_connect_dbt_api_api_connect_dbt_post"},"Body_connect_drive_api_connect_drive_post":{"properties":{"credentials_json":{"type":"string","title":"Credentials Json"},"mode":{"type":"string","title":"Mode","default":"shared"},"drive_id":{"type":"string","title":"Drive Id","default":""}},"type":"object","required":["credentials_json"],"title":"Body_connect_drive_api_connect_drive_post"},"Body_connect_duckdb_api_api_connect_duckdb_post":{"properties":{"database_location":{"type":"string","title":"Database Location"},"databases":{"type":"string","title":"Databases","default":""},"schemas":{"type":"string","title":"Schemas","default":""}},"type":"object","required":["database_location"],"title":"Body_connect_duckdb_api_api_connect_duckdb_post"},"Body_connect_fabric_route_api_connect_fabric_post":{"properties":{"server":{"type":"string","title":"Server"},"database":{"type":"string","title":"Database"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"tenant_id":{"type":"string","title":"Tenant Id"},"client_id":{"type":"string","title":"Client Id"},"client_secret":{"type":"string","title":"Client Secret"},"secret_refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Secret Refs"}},"type":"object","required":["server","database"],"title":"Body_connect_fabric_route_api_connect_fabric_post"},"Body_connect_firebolt_route_api_connect_firebolt_post":{"properties":{"client_id":{"type":"string","title":"Client Id"},"client_secret":{"type":"string","title":"Client Secret","default":""},"account":{"type":"string","title":"Account"},"database":{"type":"string","title":"Database"},"engine":{"type":"string","title":"Engine"},"secret_refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Secret Refs"}},"type":"object","required":["client_id","account","database","engine"],"title":"Body_connect_firebolt_route_api_connect_firebolt_post"},"Body_connect_fox_api_connect_foxdb_post":{"properties":{"token":{"type":"string","title":"Token","default":""},"schemas":{"type":"string","title":"Schemas","default":""},"secret_refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Secret Refs"}},"type":"object","title":"Body_connect_fox_api_connect_foxdb_post"},"Body_connect_google_sheets_route_api_connect_google_sheets_post":{"properties":{"spreadsheet_urls":{"items":{},"type":"array","title":"Spreadsheet Urls"}},"type":"object","required":["spreadsheet_urls"],"title":"Body_connect_google_sheets_route_api_connect_google_sheets_post"},"Body_connect_look_api_connect_looker_post":{"properties":{"url":{"type":"string","title":"Url"},"client_id":{"type":"string","title":"Client Id"},"client_secret":{"type":"string","title":"Client Secret"}},"type":"object","required":["url","client_id","client_secret"],"title":"Body_connect_look_api_connect_looker_post"},"Body_connect_malloy_api_api_connect_malloy_post":{"properties":{"repo_url":{"type":"string","title":"Repo Url"},"branch":{"type":"string","title":"Branch","default":""},"auth_mode":{"type":"string","title":"Auth Mode","default":"pat"},"access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"},"secrets":{"additionalProperties":true,"type":"object","title":"Secrets","default":{}},"model_path":{"type":"string","title":"Model Path","default":""},"secret_refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Secret Refs"}},"type":"object","required":["repo_url"],"title":"Body_connect_malloy_api_api_connect_malloy_post"},"Body_connect_metabase_route_api_connect_metabase_post":{"properties":{"url":{"type":"string","title":"Url"},"api_key":{"type":"string","title":"Api Key"},"id":{"type":"string","title":"Id"}},"type":"object","required":["url","api_key"],"title":"Body_connect_metabase_route_api_connect_metabase_post"},"Body_connect_mixpanel_api_api_connect_mixpanel_post":{"properties":{"token_name":{"type":"string","title":"Token Name","default":""},"token_value":{"type":"string","title":"Token Value","default":""},"project_id":{"type":"string","title":"Project Id"},"region":{"type":"string","title":"Region","default":"us"},"workspace_id":{"type":"string","title":"Workspace Id","default":""}},"type":"object","required":["project_id"],"title":"Body_connect_mixpanel_api_api_connect_mixpanel_post"},"Body_connect_ms_api_connect_mssql_post":{"properties":{"server":{"type":"string","title":"Server"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password","default":""},"port":{"type":"string","title":"Port"},"database":{"type":"string","title":"Database"},"secret_refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Secret Refs"}},"type":"object","required":["server","username","port","database"],"title":"Body_connect_ms_api_connect_mssql_post"},"Body_connect_mysql_api_api_connect_mysql_post":{"properties":{"host":{"type":"string","title":"Host"},"port":{"type":"string","title":"Port"},"database":{"type":"string","title":"Database"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password","default":""},"ssh_config":{"additionalProperties":true,"type":"object","title":"Ssh Config"},"secret_refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Secret Refs"}},"type":"object","required":["host","port","database","username"],"title":"Body_connect_mysql_api_api_connect_mysql_post"},"Body_connect_neon_api_connect_neon_post":{"properties":{"host":{"type":"string","title":"Host"},"port":{"type":"integer","title":"Port","default":5432},"database":{"type":"string","title":"Database","default":"neondb"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password","default":""},"schemas":{"type":"string","title":"Schemas","default":""},"secret_refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Secret Refs"}},"type":"object","required":["host","username"],"title":"Body_connect_neon_api_connect_neon_post"},"Body_connect_notion_api_api_connect_notion_post":{"properties":{"api_token":{"type":"string","title":"Api Token"}},"type":"object","required":["api_token"],"title":"Body_connect_notion_api_api_connect_notion_post"},"Body_connect_oracle_api_api_connect_oracle_post":{"properties":{"host":{"type":"string","title":"Host"},"port":{"type":"string","title":"Port"},"service_name":{"type":"string","title":"Service Name"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password","default":""},"ssh_config":{"additionalProperties":true,"type":"object","title":"Ssh Config"},"secret_refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Secret Refs"}},"type":"object","required":["host","port","service_name","username"],"title":"Body_connect_oracle_api_api_connect_oracle_post"},"Body_connect_pg_api_connect_postgres_post":{"properties":{"host":{"type":"string","title":"Host"},"port":{"type":"string","title":"Port"},"database":{"type":"string","title":"Database"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password","default":""},"schemas":{"type":"string","title":"Schemas","default":""},"ssl_mode":{"type":"string","title":"Ssl Mode","default":"prefer"},"ssh_config":{"additionalProperties":true,"type":"object","title":"Ssh Config"},"secret_refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Secret Refs"}},"type":"object","required":["host","port","database","username","ssh_config"],"title":"Body_connect_pg_api_connect_postgres_post"},"Body_connect_red_api_connect_redshift_post":{"properties":{"host":{"type":"string","title":"Host"},"port":{"type":"string","title":"Port"},"database":{"type":"string","title":"Database"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password","default":""},"schemas":{"type":"string","title":"Schemas","default":""},"ssh_config":{"additionalProperties":true,"type":"object","title":"Ssh Config"},"ssl_mode":{"type":"string","title":"Ssl Mode","default":"verify-full"},"secret_refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Secret Refs"}},"type":"object","required":["host","port","username","ssh_config"],"title":"Body_connect_red_api_connect_redshift_post"},"Body_connect_saphana_api_api_connect_saphana_post":{"properties":{"server":{"type":"string","title":"Server"},"port":{"type":"string","title":"Port"},"database":{"type":"string","title":"Database"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password","default":""},"secret_refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Secret Refs"}},"type":"object","required":["server","port","database","username"],"title":"Body_connect_saphana_api_api_connect_saphana_post"},"Body_connect_secrets_route_api_connect_secrets_post":{"properties":{"name":{"type":"string","title":"Name"},"secrets":{"additionalProperties":true,"type":"object","title":"Secrets"},"id":{"type":"string","title":"Id"},"secret_keys":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Secret Keys"}},"type":"object","required":["name","secrets"],"title":"Body_connect_secrets_route_api_connect_secrets_post"},"Body_connect_sigma_route_api_connect_sigma_post":{"properties":{"hostname":{"type":"string","title":"Hostname"},"client_id":{"type":"string","title":"Client Id"},"client_secret":{"type":"string","title":"Client Secret"},"id":{"type":"string","title":"Id"}},"type":"object","required":["hostname","client_id","client_secret"],"title":"Body_connect_sigma_route_api_connect_sigma_post"},"Body_connect_slite_api_api_connect_slite_post":{"properties":{"api_token":{"type":"string","title":"Api Token"}},"type":"object","required":["api_token"],"title":"Body_connect_slite_api_api_connect_slite_post"},"Body_connect_source_api_replication_connect_post":{"properties":{"source_type":{"type":"string","title":"Source Type"},"credentials":{"additionalProperties":true,"type":"object","title":"Credentials"},"dataset_name":{"type":"string","title":"Dataset Name"},"schedule_hours":{"type":"integer","title":"Schedule Hours","default":6}},"type":"object","required":["source_type","credentials"],"title":"Body_connect_source_api_replication_connect_post"},"Body_connect_steep_api_api_connect_steep_post":{"properties":{"api_key":{"type":"string","title":"Api Key"}},"type":"object","required":["api_key"],"title":"Body_connect_steep_api_api_connect_steep_post"},"Body_connect_supabase_api_connect_supabase_post":{"properties":{"host":{"type":"string","title":"Host"},"port":{"type":"integer","title":"Port","default":5432},"database":{"type":"string","title":"Database","default":"postgres"},"username":{"type":"string","title":"Username","default":"postgres"},"password":{"type":"string","title":"Password","default":""},"schemas":{"type":"string","title":"Schemas","default":""},"secret_refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Secret Refs"}},"type":"object","required":["host"],"title":"Body_connect_supabase_api_connect_supabase_post"},"Body_connect_tableau_route_api_connect_tableau_post":{"properties":{"url":{"type":"string","title":"Url"},"site_id":{"type":"string","title":"Site Id","default":""},"token_name":{"type":"string","title":"Token Name"},"token_value":{"type":"string","title":"Token Value","default":""},"id":{"type":"string","title":"Id"},"jwt_client_id":{"type":"string","title":"Jwt Client Id","default":""},"jwt_secret_id":{"type":"string","title":"Jwt Secret Id","default":""},"jwt_secret_value":{"type":"string","title":"Jwt Secret Value","default":""},"jwt_username":{"type":"string","title":"Jwt Username","default":""}},"type":"object","required":["url","token_name"],"title":"Body_connect_tableau_route_api_connect_tableau_post"},"Body_connectors_cli_api_connectors_cli_post":{"properties":{"argv":{"items":{},"type":"array","title":"Argv"},"files":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Files"},"save":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Save"},"full":{"type":"boolean","title":"Full","default":false}},"type":"object","required":["argv"],"title":"Body_connectors_cli_api_connectors_cli_post"},"Body_connectors_cli_api_personal_connectors_cli_post":{"properties":{"argv":{"items":{},"type":"array","title":"Argv"},"files":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Files"},"save":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Save"},"full":{"type":"boolean","title":"Full","default":false}},"type":"object","required":["argv"],"title":"Body_connectors_cli_api_personal_connectors_cli_post"},"Body_consume_magic_link_api_auth_magic_link_consume_post":{"properties":{"username":{"type":"string","maxLength":100,"minLength":4,"title":"Username"},"credential":{"type":"string","maxLength":512,"minLength":6,"title":"Credential"},"cross_region_attempt":{"type":"boolean","title":"Cross Region Attempt","default":false},"redirect_only":{"type":"boolean","title":"Redirect Only","default":false}},"type":"object","required":["username","credential"],"title":"Body_consume_magic_link_api_auth_magic_link_consume_post"},"Body_create_environment_proposal_api_environments__env_id__proposal_post":{"properties":{"confirm_below_threshold":{"type":"boolean","title":"Confirm Below Threshold","default":false},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"The change in one line; it titles the GitHub pull request."},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"What changed and why, and how it was checked, for reviewers in Dot and on GitHub."}},"type":"object","title":"Body_create_environment_proposal_api_environments__env_id__proposal_post"},"Body_create_github_repo_api_github_repos_create_post":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description","default":""}},"type":"object","required":["name"],"title":"Body_create_github_repo_api_github_repos_create_post"},"Body_create_interview_chat_api_train_interview_chat_post":{"properties":{"evaluation_id":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Evaluation Id"}},"type":"object","title":"Body_create_interview_chat_api_train_interview_chat_post"},"Body_create_note_template_api_note_templates_post":{"properties":{"title":{"type":"string","title":"Title"},"note":{"type":"string","title":"Note"}},"type":"object","required":["title","note"],"title":"Body_create_note_template_api_note_templates_post"},"Body_create_org_note_api_org_notes_post":{"properties":{"title":{"type":"string","title":"Title"},"note":{"type":"string","title":"Note"},"groups":{"items":{"type":"string"},"type":"array","title":"Groups"},"active":{"type":"boolean","title":"Active","default":true},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"concept_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Concept Id"},"foundational":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Foundational"}},"type":"object","required":["title","note"],"title":"Body_create_org_note_api_org_notes_post"},"Body_create_project_api_gitlab_projects_create_post":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description","default":""}},"type":"object","required":["name"],"title":"Body_create_project_api_gitlab_projects_create_post"},"Body_create_proposal_test_environment_api_context_agent_chats__chat_id__test_environment_post":{"properties":{"replace":{"type":"boolean","title":"Replace","default":false}},"type":"object","title":"Body_create_proposal_test_environment_api_context_agent_chats__chat_id__test_environment_post"},"Body_create_token_api_tokens_post":{"properties":{"name":{"type":"string","title":"Name"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"expires_in_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires In Days","default":365},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["name"],"title":"Body_create_token_api_tokens_post"},"Body_create_training_proposal_api_train_trainings__training_id__proposal_post":{"properties":{"confirm_below_threshold":{"type":"boolean","title":"Confirm Below Threshold","default":false}},"type":"object","title":"Body_create_training_proposal_api_train_trainings__training_id__proposal_post"},"Body_create_user_route_api_create_user_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"realname":{"type":"string","title":"Realname"}},"type":"object","required":["email","password","realname"],"title":"Body_create_user_route_api_create_user_post"},"Body_create_workspace_api_create_workspace_post":{"properties":{"workspace_name":{"type":"string","title":"Workspace Name","description":"Name of the workspace to create"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","description":"Optional human-friendly display name shown in the UI"},"copy_org_data":{"type":"boolean","title":"Copy Org Data","description":"Whether to copy organization data to workspace","default":false},"source_workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Workspace Id","description":"Source workspace org_id to copy data from (defaults to parent org)"},"clone_request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Clone Request Id","description":"Client-minted per-attempt nonce (e.g. a UUID) used to build a unique clone-progress log id; ignored when copy_org_data is false. Must match ^[A-Za-z0-9_-]{1,64}$."}},"type":"object","required":["workspace_name"],"title":"Body_create_workspace_api_create_workspace_post"},"Body_deactivate_plugin_route_api_deactivate_plugin_post":{"properties":{"plugin_id":{"type":"string","title":"Plugin Id"}},"type":"object","required":["plugin_id"],"title":"Body_deactivate_plugin_route_api_deactivate_plugin_post"},"Body_deactivate_table_route_api_deactivate_table_post":{"properties":{"table_id":{"type":"string","title":"Table Id"}},"type":"object","required":["table_id"],"title":"Body_deactivate_table_route_api_deactivate_table_post"},"Body_delete_azure_group_mapping_api_delete_azure_group_mapping_post":{"properties":{"azure_group_id":{"type":"string","title":"Azure Group Id"}},"type":"object","required":["azure_group_id"],"title":"Body_delete_azure_group_mapping_api_delete_azure_group_mapping_post"},"Body_delete_file_api_delete_file_delete":{"properties":{"filename":{"type":"string","title":"Filename"}},"type":"object","required":["filename"],"title":"Body_delete_file_api_delete_file_delete"},"Body_delete_google_group_mapping_api_delete_google_group_mapping_post":{"properties":{"google_group_id":{"type":"string","title":"Google Group Id"}},"type":"object","required":["google_group_id"],"title":"Body_delete_google_group_mapping_api_delete_google_group_mapping_post"},"Body_delete_org_route_api_org_delete":{"properties":{"confirm":{"type":"boolean","title":"Confirm"}},"type":"object","required":["confirm"],"title":"Body_delete_org_route_api_org_delete"},"Body_delete_ppt_template_api_delete_ppt_template_post":{"properties":{"template_id":{"type":"string","title":"Template Id"},"confirm":{"type":"boolean","title":"Confirm"}},"type":"object","required":["template_id","confirm"],"title":"Body_delete_ppt_template_api_delete_ppt_template_post"},"Body_delete_secret_store_api_secret_stores_delete_post":{"properties":{"store_id":{"type":"string","title":"Store Id"}},"type":"object","required":["store_id"],"title":"Body_delete_secret_store_api_secret_stores_delete_post"},"Body_delete_table_api_delete_table_post":{"properties":{"table_id":{"type":"string","title":"Table Id"}},"type":"object","required":["table_id"],"title":"Body_delete_table_api_delete_table_post"},"Body_delete_user_route_api_delete_user_post":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"Body_delete_user_route_api_delete_user_post"},"Body_delete_workspace_route_api_delete_workspace_delete":{"properties":{"workspace_name":{"type":"string","title":"Workspace Name","description":"Name of the workspace to delete"}},"type":"object","required":["workspace_name"],"title":"Body_delete_workspace_route_api_delete_workspace_delete"},"Body_disablePasswordLogin_api_set_disable_password_login_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_disablePasswordLogin_api_set_disable_password_login_post"},"Body_disconnect_api_gitlab_disconnect_delete":{"properties":{"confirm":{"type":"boolean","title":"Confirm"}},"type":"object","required":["confirm"],"title":"Body_disconnect_api_gitlab_disconnect_delete"},"Body_disconnect_github_api_github_disconnect_delete":{"properties":{"confirm":{"type":"boolean","title":"Confirm"}},"type":"object","required":["confirm"],"title":"Body_disconnect_github_api_github_disconnect_delete"},"Body_dismiss_chat_completion_api_dismiss_chat_completion_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"}},"type":"object","required":["chat_id"],"title":"Body_dismiss_chat_completion_api_dismiss_chat_completion_post"},"Body_dismiss_disclaimer_api_auth_dismiss_disclaimer_post":{"properties":{"disclaimer_hash":{"type":"string","title":"Disclaimer Hash"}},"type":"object","required":["disclaimer_hash"],"title":"Body_dismiss_disclaimer_api_auth_dismiss_disclaimer_post"},"Body_drive_cli_api_drive_cli_post":{"properties":{"argv":{"items":{},"type":"array","title":"Argv"},"connection_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connection Id"}},"type":"object","required":["argv"],"title":"Body_drive_cli_api_drive_cli_post"},"Body_edit_user_memory_api_auth_user_memory__memory_id__put":{"properties":{"memory":{"type":"string","maxLength":2000,"minLength":1,"title":"Memory"},"title":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Title"}},"type":"object","required":["memory"],"title":"Body_edit_user_memory_api_auth_user_memory__memory_id__put"},"Body_edit_visualization_route_api_edit_visualization_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"message_uuid":{"type":"string","title":"Message Uuid"},"modification_request":{"type":"string","title":"Modification Request"},"chart_id":{"type":"string","title":"Chart Id"},"message_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Message Index"}},"type":"object","required":["chat_id","message_uuid","modification_request"],"title":"Body_edit_visualization_route_api_edit_visualization_post"},"Body_execute_query_api_execute_query_post":{"properties":{"query":{"type":"string","title":"Query"},"connection_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connection Id"},"output_format":{"type":"string","title":"Output Format","default":"html"}},"type":"object","required":["query"],"title":"Body_execute_query_api_execute_query_post"},"Body_execute_query_for_context_agent_api_context_agent_execute_query_post":{"properties":{"query":{"type":"string","title":"Query"},"table_name":{"type":"string","title":"Table Name"},"max_rows":{"type":"integer","maximum":10000.0,"exclusiveMinimum":0.0,"title":"Max Rows","default":10000}},"type":"object","required":["query","table_name"],"title":"Body_execute_query_for_context_agent_api_context_agent_execute_query_post"},"Body_extract_tableau_view_api_extract_tableau_view_post":{"properties":{"connection_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connection Id"},"view_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"View Id"},"view_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"View Name"},"workbook_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workbook Id"},"view_content_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"View Content Url"},"filters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Filters"},"parameters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Parameters"},"max_rows":{"type":"integer","title":"Max Rows","default":10000},"describe_only":{"type":"boolean","title":"Describe Only","default":false},"capture_evidence":{"type":"boolean","title":"Capture Evidence","default":false},"include_values":{"type":"boolean","title":"Include Values","default":true},"include_snapshot":{"type":"boolean","title":"Include Snapshot","default":true},"async_job":{"type":"boolean","title":"Async Job","default":false},"worksheet_names":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Worksheet Names"},"describe_level":{"type":"string","enum":["controls","full"],"title":"Describe Level","default":"full"}},"type":"object","title":"Body_extract_tableau_view_api_extract_tableau_view_post"},"Body_find_company_palette_api_find_company_palette_post":{"properties":{"website":{"type":"string","title":"Website"}},"type":"object","required":["website"],"title":"Body_find_company_palette_api_find_company_palette_post"},"Body_fork_shared_chat_api_fork_shared_chat_post":{"properties":{"source_chat_id":{"type":"string","title":"Source Chat Id"},"source_org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Org Id"}},"type":"object","required":["source_chat_id"],"title":"Body_fork_shared_chat_api_fork_shared_chat_post"},"Body_get_embedded_user_login_token_api_auth_embedded_user_login_post":{"properties":{"user_id":{"type":"string","title":"User Id"},"create_if_not_exists":{"type":"boolean","title":"Create If Not Exists","default":false},"groups":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Groups"}},"type":"object","required":["user_id"],"title":"Body_get_embedded_user_login_token_api_auth_embedded_user_login_post"},"Body_get_tables_bulk_api_tables_bulk_post":{"properties":{"table_ids":{"items":{"type":"string"},"type":"array","title":"Table Ids"}},"type":"object","required":["table_ids"],"title":"Body_get_tables_bulk_api_tables_bulk_post"},"Body_gitlab_connect_api_gitlab_connect_post":{"properties":{"token":{"type":"string","title":"Token"},"base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Url"}},"type":"object","required":["token"],"title":"Body_gitlab_connect_api_gitlab_connect_post"},"Body_grant_bonus_credits_api_platform_admin_orgs__org_id__bonus_credits_post":{"properties":{"bonus_credits":{"type":"integer","title":"Bonus Credits"},"mode":{"type":"string","title":"Mode","default":"add"}},"type":"object","required":["bonus_credits"],"title":"Body_grant_bonus_credits_api_platform_admin_orgs__org_id__bonus_credits_post"},"Body_inspect_malloy_repo_api_api_inspect_malloy_repo_post":{"properties":{"repo_url":{"type":"string","title":"Repo Url"},"branch":{"type":"string","title":"Branch","default":""},"auth_mode":{"type":"string","title":"Auth Mode","default":"pat"},"access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"},"model_path":{"type":"string","title":"Model Path","default":""},"secret_refs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Secret Refs"}},"type":"object","required":["repo_url"],"title":"Body_inspect_malloy_repo_api_api_inspect_malloy_repo_post"},"Body_install_skill_from_url_api_skills_install_from_url_post":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"Body_install_skill_from_url_api_skills_install_from_url_post"},"Body_login_complete_with_mfa_api_auth_token_mfa_post":{"properties":{"mfa_token":{"type":"string","title":"Mfa Token"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"recovery_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recovery Code"}},"type":"object","required":["mfa_token"],"title":"Body_login_complete_with_mfa_api_auth_token_mfa_post"},"Body_login_for_access_token_api_auth_token_post":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"grant_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grant Type","default":"password"},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"},"cross_region_attempt":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Cross Region Attempt","default":false}},"type":"object","required":["username","password"],"title":"Body_login_for_access_token_api_auth_token_post"},"Body_logout_api_auth_logout_post":{"properties":{"confirm":{"type":"boolean","title":"Confirm"}},"type":"object","required":["confirm"],"title":"Body_logout_api_auth_logout_post"},"Body_looker_cli_api_looker_cli_post":{"properties":{"argv":{"items":{},"type":"array","title":"Argv"},"connection_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connection Id"}},"type":"object","required":["argv"],"title":"Body_looker_cli_api_looker_cli_post"},"Body_merge_chat_to_production_api_context_agent_chats__chat_id__merge_post":{"properties":{"confirm":{"type":"boolean","title":"Confirm"},"selected_files":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Selected Files"},"expected_merge_target":{"anyOf":[{"type":"string","enum":["production","environment"]},{"type":"null"}],"title":"Expected Merge Target"},"expected_main_head":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Main Head"},"expected_environment_head":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Environment Head"},"expected_training_head":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Training Head"},"expected_session_head":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Session Head"},"confirm_below_threshold":{"type":"boolean","title":"Confirm Below Threshold","default":false},"recheck_first":{"type":"boolean","title":"Recheck First","default":false}},"type":"object","required":["confirm"],"title":"Body_merge_chat_to_production_api_context_agent_chats__chat_id__merge_post"},"Body_mfa_confirm_api_auth_mfa_confirm_post":{"properties":{"code":{"type":"string","title":"Code"},"mfa_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mfa Token"}},"type":"object","required":["code"],"title":"Body_mfa_confirm_api_auth_mfa_confirm_post"},"Body_mfa_disable_api_auth_mfa_disable_post":{"properties":{"code":{"type":"string","title":"Code"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"}},"type":"object","required":["code"],"title":"Body_mfa_disable_api_auth_mfa_disable_post"},"Body_mfa_regenerate_recovery_codes_api_auth_mfa_recovery_codes_regenerate_post":{"properties":{"code":{"type":"string","title":"Code"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"}},"type":"object","required":["code"],"title":"Body_mfa_regenerate_recovery_codes_api_auth_mfa_recovery_codes_regenerate_post"},"Body_mfa_self_recovery_consume_api_auth_mfa_recovery_consume_post":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"Body_mfa_self_recovery_consume_api_auth_mfa_recovery_consume_post"},"Body_mfa_self_recovery_request_api_auth_mfa_recovery_request_post":{"properties":{"mfa_token":{"type":"string","title":"Mfa Token"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"}},"type":"object","required":["mfa_token"],"title":"Body_mfa_self_recovery_request_api_auth_mfa_recovery_request_post"},"Body_mfa_setup_api_auth_mfa_setup_post":{"properties":{"mfa_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mfa Token"}},"type":"object","title":"Body_mfa_setup_api_auth_mfa_setup_post"},"Body_notion_reachable_pages_api_notion_reachable_pages_post":{"properties":{"limit":{"type":"integer","title":"Limit","default":5}},"type":"object","title":"Body_notion_reachable_pages_api_notion_reachable_pages_post"},"Body_open_proposal_github_pull_request_api_context_agent_chats__chat_id__github_pull_request_post":{"properties":{"expected_environment_head":{"type":"string","title":"Expected Environment Head"}},"type":"object","required":["expected_environment_head"],"title":"Body_open_proposal_github_pull_request_api_context_agent_chats__chat_id__github_pull_request_post"},"Body_parse_csv_preview_api_train_parse_csv_preview_post":{"properties":{"text":{"type":"string","maxLength":5242880,"title":"Text","default":""},"upload_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Upload Name"}},"type":"object","title":"Body_parse_csv_preview_api_train_parse_csv_preview_post"},"Body_powerbi_cli_api_powerbi_cli_post":{"properties":{"argv":{"items":{},"type":"array","title":"Argv"},"connection_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connection Id"},"workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Id"}},"type":"object","required":["argv"],"title":"Body_powerbi_cli_api_powerbi_cli_post"},"Body_powerbi_oauth_initiate_api_powerbi_oauth_initiate_post":{"properties":{"workspace_id":{"type":"string","title":"Workspace Id"},"dataset_id":{"type":"string","title":"Dataset Id"},"scope_mode":{"type":"string","title":"Scope Mode","default":"read"}},"type":"object","title":"Body_powerbi_oauth_initiate_api_powerbi_oauth_initiate_post"},"Body_register_user_api_auth_register_post":{"properties":{"username":{"type":"string","maxLength":100,"minLength":4,"pattern":"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$","title":"Username"},"password":{"type":"string","maxLength":1000,"title":"Password"},"realname":{"type":"string","maxLength":64,"pattern":"^[\\w \\-]+$","title":"Realname"},"gclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gclid"},"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Campaign"},"utm_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Content"},"utm_term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Term"},"cta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta"},"referrer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer"},"landing_page":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Landing Page"}},"type":"object","required":["username","password","realname"],"title":"Body_register_user_api_auth_register_post"},"Body_reject_chat_proposal_api_context_agent_chats__chat_id__reject_post":{"properties":{"confirm":{"type":"boolean","title":"Confirm"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["confirm"],"title":"Body_reject_chat_proposal_api_context_agent_chats__chat_id__reject_post"},"Body_remove_connection_api_remove_connection_post":{"properties":{"integration":{"additionalProperties":true,"type":"object","title":"Integration"},"delete_data":{"type":"boolean","title":"Delete Data","default":false}},"type":"object","required":["integration"],"title":"Body_remove_connection_api_remove_connection_post"},"Body_remove_doc_from_group_api_remove_doc_from_group_post":{"properties":{"doc_id":{"type":"string","title":"Doc Id"},"group":{"type":"string","title":"Group"}},"type":"object","required":["doc_id","group"],"title":"Body_remove_doc_from_group_api_remove_doc_from_group_post"},"Body_remove_job_route_api_remove_job_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"job_id":{"type":"string","title":"Job Id"}},"type":"object","required":["chat_id","job_id"],"title":"Body_remove_job_route_api_remove_job_post"},"Body_remove_message_job_route_api_remove_message_job_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"job_id":{"type":"string","title":"Job Id"},"message_uuid":{"type":"string","title":"Message Uuid"}},"type":"object","required":["chat_id","job_id"],"title":"Body_remove_message_job_route_api_remove_message_job_post"},"Body_remove_sso_api_remove_sso_post":{"properties":{"type":{"type":"string","title":"Type"}},"type":"object","required":["type"],"title":"Body_remove_sso_api_remove_sso_post"},"Body_remove_sync_job_api_remove_sync_job_post":{"properties":{"connection_id":{"type":"string","title":"Connection Id"},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["connection_id"],"title":"Body_remove_sync_job_api_remove_sync_job_post"},"Body_remove_user_from_group_api_remove_user_from_group_post":{"properties":{"email":{"type":"string","title":"Email"},"group":{"type":"string","title":"Group"}},"type":"object","required":["email","group"],"title":"Body_remove_user_from_group_api_remove_user_from_group_post"},"Body_remove_user_from_workspace_api_remove_user_from_workspace_post":{"properties":{"user_email":{"type":"string","title":"User Email","description":"Email of the user to remove from workspace"},"workspace_name":{"type":"string","title":"Workspace Name","description":"Name of the workspace"}},"type":"object","required":["user_email","workspace_name"],"title":"Body_remove_user_from_workspace_api_remove_user_from_workspace_post"},"Body_rename_chat_label_api_rename_chat_label_post":{"properties":{"label":{"type":"string","title":"Label"},"new_label":{"type":"string","title":"New Label"}},"type":"object","required":["label","new_label"],"title":"Body_rename_chat_label_api_rename_chat_label_post"},"Body_request_magic_link_api_auth_magic_link_request_post":{"properties":{"username":{"type":"string","maxLength":100,"minLength":4,"pattern":"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$","title":"Username"},"intent":{"type":"string","title":"Intent","default":"login"},"realname":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Realname"},"gclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gclid"},"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Campaign"},"utm_content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Content"},"utm_term":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Term"},"cta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta"},"referrer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer"},"landing_page":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Landing Page"},"terms_accepted":{"type":"boolean","title":"Terms Accepted","default":false},"return_to":{"type":"string","maxLength":2048,"title":"Return To","default":"/"},"cross_region_attempt":{"type":"boolean","title":"Cross Region Attempt","default":false}},"type":"object","required":["username"],"title":"Body_request_magic_link_api_auth_magic_link_request_post"},"Body_request_personal_connector_api_personal_connectors_request_post":{"properties":{"tools":{"type":"string","title":"Tools"}},"type":"object","required":["tools"],"title":"Body_request_personal_connector_api_personal_connectors_request_post"},"Body_rerun_agentic_query_route_api_rerun_agentic_query_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"df_key":{"type":"string","title":"Df Key"},"viz_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Viz Key"},"message_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Uuid"}},"type":"object","required":["chat_id","df_key"],"title":"Body_rerun_agentic_query_route_api_rerun_agentic_query_post"},"Body_rerun_query_route_api_rerun_query_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"message_uuid":{"type":"string","title":"Message Uuid"}},"type":"object","required":["chat_id","message_uuid"],"title":"Body_rerun_query_route_api_rerun_query_post"},"Body_resend_verification_mail_api_auth_resend_verification_mail_post":{"properties":{"username":{"type":"string","title":"Username"}},"type":"object","required":["username"],"title":"Body_resend_verification_mail_api_auth_resend_verification_mail_post"},"Body_reset_logo_api_reset_logo_post":{"properties":{"confirm":{"type":"boolean","title":"Confirm"}},"type":"object","required":["confirm"],"title":"Body_reset_logo_api_reset_logo_post"},"Body_reset_password_api_auth_reset_password_post":{"properties":{"username":{"type":"string","title":"Username"},"token":{"type":"string","title":"Token"},"password":{"type":"string","title":"Password"}},"type":"object","required":["username","token","password"],"title":"Body_reset_password_api_auth_reset_password_post"},"Body_resolve_chat_ticket_api_context_agent_chats__chat_id__resolve_post":{"properties":{"resolution":{"type":"string","title":"Resolution"},"confirm":{"type":"boolean","title":"Confirm"}},"type":"object","required":["resolution","confirm"],"title":"Body_resolve_chat_ticket_api_context_agent_chats__chat_id__resolve_post"},"Body_restore_chart_version_api_restore_chart_version_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"message_uuid":{"type":"string","title":"Message Uuid"},"chart_id":{"type":"string","title":"Chart Id"},"version_seq":{"type":"integer","title":"Version Seq"}},"type":"object","required":["chat_id","message_uuid","chart_id","version_seq"],"title":"Body_restore_chart_version_api_restore_chart_version_post"},"Body_revert_to_commit_api_revert_to_commit_post":{"properties":{"commit_id":{"type":"string","title":"Commit Id"},"confirm":{"type":"boolean","title":"Confirm"},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path"}},"type":"object","required":["commit_id","confirm"],"title":"Body_revert_to_commit_api_revert_to_commit_post"},"Body_save_azure_group_mapping_api_save_azure_group_mapping_post":{"properties":{"mapping":{"additionalProperties":true,"type":"object","title":"Mapping"}},"type":"object","required":["mapping"],"title":"Body_save_azure_group_mapping_api_save_azure_group_mapping_post"},"Body_save_branding_api_save_branding_post":{"properties":{"app_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Name"},"app_primary_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Primary Color"},"app_placeholder":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Placeholder"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"use_domain_favicon":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Domain Favicon"}},"type":"object","title":"Body_save_branding_api_save_branding_post"},"Body_save_cached_chart_api_save_cached_chart_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"message_uuid":{"type":"string","title":"Message Uuid"},"cache_token":{"type":"string","title":"Cache Token"},"chart_id":{"type":"string","title":"Chart Id"},"message_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Message Index"}},"type":"object","required":["chat_id","message_uuid","cache_token"],"title":"Body_save_cached_chart_api_save_cached_chart_post"},"Body_save_color_palette_api_save_color_palette_post":{"properties":{"palette":{"items":{"type":"string"},"type":"array","title":"Palette"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"source":{"type":"string","enum":["preset","custom","company"],"title":"Source","default":"custom"},"discovery_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discovery Token"}},"type":"object","required":["palette"],"title":"Body_save_color_palette_api_save_color_palette_post"},"Body_save_config_api_gitlab_config_post":{"properties":{"project_id":{"type":"integer","title":"Project Id"},"project_path":{"type":"string","title":"Project Path"},"branch":{"type":"string","title":"Branch","default":"main"},"sync_enabled":{"type":"boolean","title":"Sync Enabled","default":true}},"type":"object","required":["project_id","project_path"],"title":"Body_save_config_api_gitlab_config_post"},"Body_save_email_bot_config_api_save_email_bot_config_post":{"properties":{"email_domains":{"items":{},"type":"array","title":"Email Domains"},"email_bot_enabled":{"type":"boolean","title":"Email Bot Enabled"},"email_auth_type":{"type":"string","title":"Email Auth Type","default":"basic"},"email_imap_host":{"type":"string","title":"Email Imap Host"},"email_imap_port":{"type":"integer","title":"Email Imap Port"},"email_imap_username":{"type":"string","title":"Email Imap Username"},"email_imap_password":{"type":"string","title":"Email Imap Password"},"email_imap_use_ssl":{"type":"boolean","title":"Email Imap Use Ssl","default":true},"email_oauth2_tenant_id":{"type":"string","title":"Email Oauth2 Tenant Id"},"email_oauth2_client_id":{"type":"string","title":"Email Oauth2 Client Id"},"email_oauth2_client_secret":{"type":"string","title":"Email Oauth2 Client Secret"},"email_oauth2_scope":{"type":"string","title":"Email Oauth2 Scope","default":"https://outlook.office365.com/.default"}},"type":"object","required":["email_domains","email_bot_enabled"],"title":"Body_save_email_bot_config_api_save_email_bot_config_post"},"Body_save_github_config_api_github_config_post":{"properties":{"repo_full_name":{"type":"string","title":"Repo Full Name"},"branch":{"type":"string","title":"Branch","default":"main"},"sync_enabled":{"type":"boolean","title":"Sync Enabled","default":true}},"type":"object","required":["repo_full_name"],"title":"Body_save_github_config_api_github_config_post"},"Body_save_google_group_mapping_api_save_google_group_mapping_post":{"properties":{"mapping":{"additionalProperties":true,"type":"object","title":"Mapping"}},"type":"object","required":["mapping"],"title":"Body_save_google_group_mapping_api_save_google_group_mapping_post"},"Body_save_immuta_settings_api_save_immuta_settings_post":{"properties":{"tenant_url":{"type":"string","title":"Tenant Url","default":""},"api_key":{"type":"string","title":"Api Key","default":""}},"type":"object","title":"Body_save_immuta_settings_api_save_immuta_settings_post"},"Body_save_mcp_connector_api_mcp_connectors_save_post":{"properties":{"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"description":{"type":"string","title":"Description"},"url":{"type":"string","title":"Url"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"api_key_header":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Header"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"}},"type":"object","required":["name","slug","description","url"],"title":"Body_save_mcp_connector_api_mcp_connectors_save_post"},"Body_save_message_order_api_save_message_order_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"message_uuid":{"type":"string","title":"Message Uuid"},"direction":{"type":"string","title":"Direction"},"block_mode":{"type":"boolean","title":"Block Mode","default":false}},"type":"object","required":["chat_id","message_uuid","direction"],"title":"Body_save_message_order_api_save_message_order_post"},"Body_save_modules_api_save_modules_post":{"properties":{"enabled_interpretation":{"type":"boolean","title":"Enabled Interpretation"},"enabled_auto_joins":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled Auto Joins","default":false},"enabled_custom_appendix":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled Custom Appendix","default":false},"custom_appendix_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Appendix Text","default":""}},"type":"object","required":["enabled_interpretation"],"title":"Body_save_modules_api_save_modules_post"},"Body_save_secret_store_api_secret_stores_save_post":{"properties":{"store":{"additionalProperties":true,"type":"object","title":"Store"}},"type":"object","required":["store"],"title":"Body_save_secret_store_api_secret_stores_save_post"},"Body_save_skill_api_skills_post":{"properties":{"skill_name":{"type":"string","title":"Skill Name"},"content":{"type":"string","title":"Content"}},"type":"object","required":["skill_name","content"],"title":"Body_save_skill_api_skills_post"},"Body_save_slack_team_id_api_save_slack_team_id_post":{"properties":{"slack_team_id":{"type":"string","title":"Slack Team Id"},"slack_enterprise_id":{"type":"string","title":"Slack Enterprise Id"},"slack_auto_reply":{"type":"boolean","title":"Slack Auto Reply"},"slack_dms":{"type":"boolean","title":"Slack Dms"},"slack_allow_subworkspace_scheduling":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Slack Allow Subworkspace Scheduling"}},"type":"object","required":["slack_team_id","slack_enterprise_id","slack_auto_reply","slack_dms"],"title":"Body_save_slack_team_id_api_save_slack_team_id_post"},"Body_save_smtp_settings_api_save_smtp_settings_post":{"properties":{"smtp_server":{"type":"string","title":"Smtp Server"},"smtp_port":{"type":"integer","title":"Smtp Port"},"smtp_username":{"type":"string","title":"Smtp Username"},"smtp_password":{"type":"string","title":"Smtp Password"},"smtp_from_address":{"type":"string","title":"Smtp From Address"},"smtp_from_name":{"type":"string","title":"Smtp From Name"},"smtp_app_name":{"type":"string","title":"Smtp App Name"},"smtp_enabled":{"type":"boolean","title":"Smtp Enabled"}},"type":"object","required":["smtp_server","smtp_port","smtp_username","smtp_password","smtp_from_address","smtp_from_name","smtp_app_name","smtp_enabled"],"title":"Body_save_smtp_settings_api_save_smtp_settings_post"},"Body_save_sso_api_save_sso_post":{"properties":{"type":{"type":"string","title":"Type"},"client_id":{"type":"string","title":"Client Id"},"client_secret":{"type":"string","title":"Client Secret"},"metadata_url":{"type":"string","title":"Metadata Url"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"}},"type":"object","required":["type","client_id","client_secret","metadata_url"],"title":"Body_save_sso_api_save_sso_post"},"Body_save_table_doc_api_save_table_doc_post":{"properties":{"table":{"additionalProperties":true,"type":"object","title":"Table"}},"type":"object","required":["table"],"title":"Body_save_table_doc_api_save_table_doc_post"},"Body_save_teams_tenant_id_api_save_teams_tenant_id_post":{"properties":{"teams_tenant_id":{"type":"string","title":"Teams Tenant Id"},"teams_auto_reply":{"type":"boolean","title":"Teams Auto Reply"},"teams_user_model":{"type":"string","title":"Teams User Model","default":"team"}},"type":"object","required":["teams_tenant_id","teams_auto_reply"],"title":"Body_save_teams_tenant_id_api_save_teams_tenant_id_post"},"Body_scan_table_route_api_scan_table_post":{"properties":{"table_id":{"type":"string","title":"Table Id"}},"type":"object","required":["table_id"],"title":"Body_scan_table_route_api_scan_table_post"},"Body_secret_store_keys_api_secret_stores_keys_post":{"properties":{"store_id":{"type":"string","title":"Store Id"},"ref":{"type":"string","title":"Ref"}},"type":"object","required":["store_id","ref"],"title":"Body_secret_store_keys_api_secret_stores_keys_post"},"Body_sendInvitations_api_send_invitations_post":{"properties":{"emails":{"items":{"type":"string"},"type":"array","title":"Emails"}},"type":"object","required":["emails"],"title":"Body_sendInvitations_api_send_invitations_post"},"Body_send_message_api_send_message_post":{"properties":{"channel":{"type":"string","enum":["slack","email"],"title":"Channel"},"to":{"items":{"type":"string"},"type":"array","title":"To","description":"Repeat for each recipient (at most 20). Slack: a channel the Dot bot is in, as #name or id, or a workspace member's email for a DM. Email: workspace members' addresses."},"text":{"type":"string","title":"Text","description":"Markdown, up to 30,000 characters. Mentions such as @channel stay plain text."},"subject":{"type":"string","title":"Subject","description":"Email subject. Defaults to 'Message from <app name>'. Ignored for Slack.","default":""},"link_url":{"type":"string","title":"Link Url","description":"Optional http(s) URL shown as a link under the text.","default":""},"link_text":{"type":"string","title":"Link Text","description":"Label for link_url. Defaults to 'Open'.","default":""},"idempotency_key":{"type":"string","title":"Idempotency Key","description":"Optional. A recipient that already got this key in the last 7 days is skipped (status 'duplicate') instead of messaged again. Use a stable id, e.g. 'proposal-<id>'.","default":""},"dry_run":{"type":"boolean","title":"Dry Run","description":"Resolve every recipient and check everything, but send nothing.","default":false},"files":{"anyOf":[{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array"},{"type":"null"}],"title":"Files","description":"Attachments: at most 10, 20 MB each, 25 MB total."}},"type":"object","required":["channel","to","text"],"title":"Body_send_message_api_send_message_post"},"Body_setNewUserAsAdmin_api_set_new_user_admin_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_setNewUserAsAdmin_api_set_new_user_admin_post"},"Body_setOrgRegistration_api_set_org_registration_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_setOrgRegistration_api_set_org_registration_post"},"Body_set_activate_new_columns_api_set_activate_new_columns_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_activate_new_columns_api_set_activate_new_columns_post"},"Body_set_admin_ticket_emails_enabled_api_set_admin_ticket_emails_enabled_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_admin_ticket_emails_enabled_api_set_admin_ticket_emails_enabled_post"},"Body_set_allow_public_links_api_set_allow_public_links_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_allow_public_links_api_set_allow_public_links_post"},"Body_set_allow_user_mode_selection_api_set_allow_user_mode_selection_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_allow_user_mode_selection_api_set_allow_user_mode_selection_post"},"Body_set_allowed_email_domains_api_set_allowed_email_domains_post":{"properties":{"domains":{"items":{"type":"string"},"type":"array","title":"Domains"}},"type":"object","required":["domains"],"title":"Body_set_allowed_email_domains_api_set_allowed_email_domains_post"},"Body_set_app_authoring_access_api_set_app_authoring_access_post":{"properties":{"audience":{"type":"string","title":"Audience"},"groups":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Groups"}},"type":"object","required":["audience"],"title":"Body_set_app_authoring_access_api_set_app_authoring_access_post"},"Body_set_app_auto_archive_days_api_set_app_auto_archive_days_post":{"properties":{"value":{"type":"integer","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_app_auto_archive_days_api_set_app_auto_archive_days_post"},"Body_set_app_auto_archive_enabled_api_set_app_auto_archive_enabled_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_app_auto_archive_enabled_api_set_app_auto_archive_enabled_post"},"Body_set_app_certification_api_certification_set_post":{"properties":{"app_id":{"type":"string","title":"App Id"},"state":{"type":"string","title":"State"},"note":{"type":"string","title":"Note","default":""}},"type":"object","required":["app_id","state"],"title":"Body_set_app_certification_api_certification_set_post"},"Body_set_auto_sample_enabled_api_set_auto_sample_enabled_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_auto_sample_enabled_api_set_auto_sample_enabled_post"},"Body_set_azure_allowed_tenant_ids_api_set_azure_allowed_tenant_ids_post":{"properties":{"tenant_ids":{"items":{"type":"string"},"type":"array","title":"Tenant Ids"}},"type":"object","required":["tenant_ids"],"title":"Body_set_azure_allowed_tenant_ids_api_set_azure_allowed_tenant_ids_post"},"Body_set_azure_rollout_api_set_azure_rollout_post":{"properties":{"mode":{"type":"string","title":"Mode"},"workspaces":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Workspaces"}},"type":"object","required":["mode"],"title":"Body_set_azure_rollout_api_set_azure_rollout_post"},"Body_set_azure_workspace_sync_mode_api_set_azure_workspace_sync_mode_post":{"properties":{"mode":{"type":"string","title":"Mode"}},"type":"object","required":["mode"],"title":"Body_set_azure_workspace_sync_mode_api_set_azure_workspace_sync_mode_post"},"Body_set_capability_flag_api_set_capability_flag_post":{"properties":{"flag":{"type":"string","title":"Flag"},"value":{"type":"boolean","title":"Value"}},"type":"object","required":["flag","value"],"title":"Body_set_capability_flag_api_set_capability_flag_post"},"Body_set_chat_retention_days_api_set_chat_retention_days_post":{"properties":{"value":{"type":"integer","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_chat_retention_days_api_set_chat_retention_days_post"},"Body_set_connector_skill_active_api_skills_connector__skill_name__active_post":{"properties":{"active":{"type":"boolean","title":"Active"}},"type":"object","required":["active"],"title":"Body_set_connector_skill_active_api_skills_connector__skill_name__active_post"},"Body_set_credit_limit_mode_api_set_credit_limit_mode_post":{"properties":{"mode":{"type":"string","title":"Mode"}},"type":"object","required":["mode"],"title":"Body_set_credit_limit_mode_api_set_credit_limit_mode_post"},"Body_set_custom_domain_api_custom_domain_set_post":{"properties":{"domain":{"type":"string","title":"Domain"}},"type":"object","required":["domain"],"title":"Body_set_custom_domain_api_custom_domain_set_post"},"Body_set_default_mode_api_set_default_mode_post":{"properties":{"default_mode":{"type":"string","title":"Default Mode"}},"type":"object","required":["default_mode"],"title":"Body_set_default_mode_api_set_default_mode_post"},"Body_set_default_workspace_api_set_default_workspace_post":{"properties":{"workspace_org_id":{"type":"string","title":"Workspace Org Id"},"confirm":{"type":"boolean","title":"Confirm"}},"type":"object","required":["workspace_org_id","confirm"],"title":"Body_set_default_workspace_api_set_default_workspace_post"},"Body_set_disable_dot_agent_features_api_set_disable_dot_agent_features_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_disable_dot_agent_features_api_set_disable_dot_agent_features_post"},"Body_set_disable_embedded_login_api_set_disable_embedded_login_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_disable_embedded_login_api_set_disable_embedded_login_post"},"Body_set_disabled_personal_connectors_api_personal_connectors_set_disabled_post":{"properties":{"slugs":{"items":{"type":"string"},"type":"array","title":"Slugs"}},"type":"object","required":["slugs"],"title":"Body_set_disabled_personal_connectors_api_personal_connectors_set_disabled_post"},"Body_set_disclaimer_text_api_set_disclaimer_text_post":{"properties":{"value":{"type":"string","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_disclaimer_text_api_set_disclaimer_text_post"},"Body_set_economy_ai_interfaces_api_set_economy_ai_interfaces_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_economy_ai_interfaces_api_set_economy_ai_interfaces_post"},"Body_set_external_email_exempt_groups_api_set_external_email_exempt_groups_post":{"properties":{"groups":{"items":{"type":"string"},"type":"array","title":"Groups"}},"type":"object","required":["groups"],"title":"Body_set_external_email_exempt_groups_api_set_external_email_exempt_groups_post"},"Body_set_file_retention_days_api_set_file_retention_days_post":{"properties":{"value":{"type":"integer","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_file_retention_days_api_set_file_retention_days_post"},"Body_set_google_rollout_api_set_google_rollout_post":{"properties":{"mode":{"type":"string","title":"Mode"},"workspaces":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Workspaces"}},"type":"object","required":["mode"],"title":"Body_set_google_rollout_api_set_google_rollout_post"},"Body_set_google_workspace_sync_mode_api_set_google_workspace_sync_mode_post":{"properties":{"mode":{"type":"string","title":"Mode"}},"type":"object","required":["mode"],"title":"Body_set_google_workspace_sync_mode_api_set_google_workspace_sync_mode_post"},"Body_set_grandfathered_api_platform_admin_orgs__org_id__grandfathered_post":{"properties":{"grandfathered":{"type":"boolean","title":"Grandfathered","default":true}},"type":"object","title":"Body_set_grandfathered_api_platform_admin_orgs__org_id__grandfathered_post"},"Body_set_group_credit_limits_api_set_group_credit_limits_post":{"properties":{"group_limits":{"additionalProperties":true,"type":"object","title":"Group Limits","default":{}}},"type":"object","title":"Body_set_group_credit_limits_api_set_group_credit_limits_post"},"Body_set_hide_view_online_button_api_set_hide_view_online_button_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_hide_view_online_button_api_set_hide_view_online_button_post"},"Body_set_mcp_connector_tool_api_mcp_connectors__connection_id__tool_post":{"properties":{"name":{"type":"string","title":"Name"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"read_only":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Read Only"}},"type":"object","required":["name"],"title":"Body_set_mcp_connector_tool_api_mcp_connectors__connection_id__tool_post"},"Body_set_mode_group_access_api_set_mode_group_access_post":{"properties":{"access":{"additionalProperties":true,"type":"object","title":"Access"}},"type":"object","required":["access"],"title":"Body_set_mode_group_access_api_set_mode_group_access_post"},"Body_set_my_default_workspace_api_auth_set_my_default_workspace_post":{"properties":{"workspace_org_id":{"type":"string","title":"Workspace Org Id"},"confirm":{"type":"boolean","title":"Confirm"}},"type":"object","required":["workspace_org_id","confirm"],"title":"Body_set_my_default_workspace_api_auth_set_my_default_workspace_post"},"Body_set_new_table_group_api_set_new_table_group_post":{"properties":{"value":{"type":"string","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_new_table_group_api_set_new_table_group_post"},"Body_set_new_user_group_api_set_new_user_group_post":{"properties":{"value":{"type":"string","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_new_user_group_api_set_new_user_group_post"},"Body_set_okta_group_sync_api_set_okta_group_sync_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_okta_group_sync_api_set_okta_group_sync_post"},"Body_set_org_disabled_api_platform_admin_orgs__org_id__disable_post":{"properties":{"disabled":{"type":"boolean","title":"Disabled","default":true}},"type":"object","title":"Body_set_org_disabled_api_platform_admin_orgs__org_id__disable_post"},"Body_set_org_mfa_api_set_org_mfa_post":{"properties":{"mfa_required":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Mfa Required"},"mfa_required_for_admins":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Mfa Required For Admins"}},"type":"object","title":"Body_set_org_mfa_api_set_org_mfa_post"},"Body_set_overage_api_platform_admin_orgs__org_id__overage_post":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"cap_dollars":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cap Dollars"},"rate_dollars":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rate Dollars"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"}},"type":"object","required":["enabled"],"title":"Body_set_overage_api_platform_admin_orgs__org_id__overage_post"},"Body_set_per_message_credit_limit_api_set_per_message_credit_limit_post":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"limit":{"type":"integer","title":"Limit","default":30}},"type":"object","required":["enabled"],"title":"Body_set_per_message_credit_limit_api_set_per_message_credit_limit_post"},"Body_set_plan_tier_api_platform_admin_orgs__org_id__plan_tier_post":{"properties":{"plan_tier":{"type":"string","title":"Plan Tier"},"billing_interval":{"type":"string","title":"Billing Interval","default":"monthly"}},"type":"object","required":["plan_tier"],"title":"Body_set_plan_tier_api_platform_admin_orgs__org_id__plan_tier_post"},"Body_set_price_performance_optimizer_api_set_price_performance_optimizer_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_price_performance_optimizer_api_set_price_performance_optimizer_post"},"Body_set_privacy_acknowledgment_text_api_set_privacy_acknowledgment_text_post":{"properties":{"value":{"type":"string","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_privacy_acknowledgment_text_api_set_privacy_acknowledgment_text_post"},"Body_set_proposal_pull_requests_api_github_proposal_pull_requests_post":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"Body_set_proposal_pull_requests_api_github_proposal_pull_requests_post"},"Body_set_restrict_to_business_scope_api_set_restrict_to_business_scope_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_restrict_to_business_scope_api_set_restrict_to_business_scope_post"},"Body_set_routine_context_review_instructions_api_set_routine_context_review_instructions_post":{"properties":{"value":{"type":"string","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_routine_context_review_instructions_api_set_routine_context_review_instructions_post"},"Body_set_routine_context_reviews_enabled_api_set_routine_context_reviews_enabled_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_routine_context_reviews_enabled_api_set_routine_context_reviews_enabled_post"},"Body_set_schedule_paused_api_set_schedule_paused_post":{"properties":{"job_id":{"type":"string","title":"Job Id"},"paused":{"type":"boolean","title":"Paused"}},"type":"object","required":["job_id","paused"],"title":"Body_set_schedule_paused_api_set_schedule_paused_post"},"Body_set_shared_workspace_credit_limits_api_set_shared_workspace_credit_limits_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_shared_workspace_credit_limits_api_set_shared_workspace_credit_limits_post"},"Body_set_show_context_agent_tickets_to_members_api_set_show_context_agent_tickets_to_members_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_show_context_agent_tickets_to_members_api_set_show_context_agent_tickets_to_members_post"},"Body_set_show_disclaimer_api_set_show_disclaimer_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_show_disclaimer_api_set_show_disclaimer_post"},"Body_set_show_privacy_acknowledgment_api_set_show_privacy_acknowledgment_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_show_privacy_acknowledgment_api_set_show_privacy_acknowledgment_post"},"Body_set_skill_secrets_api_skills__skill_name__secrets_post":{"properties":{"secrets":{"additionalProperties":{"type":"string"},"type":"object","title":"Secrets"}},"type":"object","required":["secrets"],"title":"Body_set_skill_secrets_api_skills__skill_name__secrets_post"},"Body_set_subscription_api_newsletter_subscription_post":{"properties":{"subscribed":{"type":"boolean","title":"Subscribed"}},"type":"object","required":["subscribed"],"title":"Body_set_subscription_api_newsletter_subscription_post"},"Body_set_sync_environments_to_git_api_set_sync_environments_to_git_post":{"properties":{"value":{"type":"boolean","title":"Value"}},"type":"object","required":["value"],"title":"Body_set_sync_environments_to_git_api_set_sync_environments_to_git_post"},"Body_set_ticket_digest_settings_api_set_ticket_digest_settings_post":{"properties":{"settings":{"additionalProperties":true,"type":"object","title":"Settings"}},"type":"object","required":["settings"],"title":"Body_set_ticket_digest_settings_api_set_ticket_digest_settings_post"},"Body_set_user_azure_managed_api_set_user_azure_managed_post":{"properties":{"email":{"type":"string","title":"Email"},"azure_managed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Azure Managed"}},"type":"object","required":["email"],"title":"Body_set_user_azure_managed_api_set_user_azure_managed_post"},"Body_set_user_credit_limit_api_set_user_credit_limit_post":{"properties":{"email":{"type":"string","title":"Email"},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Limit"}},"type":"object","required":["email"],"title":"Body_set_user_credit_limit_api_set_user_credit_limit_post"},"Body_set_user_default_workspace_api_set_user_default_workspace_post":{"properties":{"email":{"type":"string","title":"Email"},"workspace_org_id":{"type":"string","title":"Workspace Org Id"}},"type":"object","required":["email","workspace_org_id"],"title":"Body_set_user_default_workspace_api_set_user_default_workspace_post"},"Body_set_user_google_managed_api_set_user_google_managed_post":{"properties":{"email":{"type":"string","title":"Email"},"google_managed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Google Managed"}},"type":"object","required":["email"],"title":"Body_set_user_google_managed_api_set_user_google_managed_post"},"Body_set_user_weekly_credit_limit_api_set_user_weekly_credit_limit_post":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"limit":{"type":"integer","title":"Limit","default":100}},"type":"object","required":["enabled"],"title":"Body_set_user_weekly_credit_limit_api_set_user_weekly_credit_limit_post"},"Body_set_workspace_display_name_api_set_workspace_display_name_post":{"properties":{"workspace_name":{"type":"string","title":"Workspace Name","description":"Internal name of the workspace to rename"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","description":"New human-friendly display name; omit or blank to clear it"}},"type":"object","required":["workspace_name"],"title":"Body_set_workspace_display_name_api_set_workspace_display_name_post"},"Body_set_write_enabled_personal_connector_api_personal_connectors_set_write_enabled_post":{"properties":{"slug":{"type":"string","title":"Slug"},"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["slug","enabled"],"title":"Body_set_write_enabled_personal_connector_api_personal_connectors_set_write_enabled_post"},"Body_settle_sync_conflict_api_github_sync_settle_post":{"properties":{"keep":{"type":"string","enum":["dot","github"],"title":"Keep"},"fingerprint":{"type":"string","title":"Fingerprint"}},"type":"object","required":["keep","fingerprint"],"title":"Body_settle_sync_conflict_api_github_sync_settle_post"},"Body_settle_sync_conflict_api_gitlab_sync_settle_post":{"properties":{"keep":{"type":"string","enum":["dot","gitlab"],"title":"Keep"},"fingerprint":{"type":"string","title":"Fingerprint"}},"type":"object","required":["keep","fingerprint"],"title":"Body_settle_sync_conflict_api_gitlab_sync_settle_post"},"Body_share_chat_api_share_chat_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"title":{"type":"string","title":"Title"}},"type":"object","required":["chat_id","title"],"title":"Body_share_chat_api_share_chat_post"},"Body_share_chat_delete_api_delete_shared_chat_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"}},"type":"object","required":["chat_id"],"title":"Body_share_chat_delete_api_delete_shared_chat_post"},"Body_share_message_api_share_message_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"message_id":{"type":"string","title":"Message Id"},"title":{"type":"string","title":"Title"}},"type":"object","required":["chat_id","message_id","title"],"title":"Body_share_message_api_share_message_post"},"Body_snowflake_marketplace_cli_api_snowflake_marketplace_cli_post":{"properties":{"argv":{"items":{},"type":"array","title":"Argv"}},"type":"object","required":["argv"],"title":"Body_snowflake_marketplace_cli_api_snowflake_marketplace_cli_post"},"Body_stop_agentic_run_api_agentic_stop_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"}},"type":"object","required":["chat_id"],"title":"Body_stop_agentic_run_api_agentic_stop_post"},"Body_stop_chat_execution_api_context_agent_chats__chat_id__stop_post":{"properties":{"confirm":{"type":"boolean","title":"Confirm"}},"type":"object","required":["confirm"],"title":"Body_stop_chat_execution_api_context_agent_chats__chat_id__stop_post"},"Body_submit_agentic_feedback_api_agentic_feedback_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"feedback":{"type":"string","title":"Feedback"}},"type":"object","required":["chat_id","feedback"],"title":"Body_submit_agentic_feedback_api_agentic_feedback_post"},"Body_suggest_api_suggest_post":{"properties":{"table":{"additionalProperties":true,"type":"object","title":"Table"}},"type":"object","required":["table"],"title":"Body_suggest_api_suggest_post"},"Body_suggest_title_api_suggest_title_post":{"properties":{"user_messages":{"type":"string","title":"User Messages"}},"type":"object","required":["user_messages"],"title":"Body_suggest_title_api_suggest_title_post"},"Body_switch_to_base_org_api_auth_switch_to_base_org_post":{"properties":{"confirm":{"type":"boolean","title":"Confirm"}},"type":"object","required":["confirm"],"title":"Body_switch_to_base_org_api_auth_switch_to_base_org_post"},"Body_switch_to_workspace_api_auth_switch_to_workspace_post":{"properties":{"workspace_name":{"type":"string","title":"Workspace Name","description":"Name of the workspace to switch to"}},"type":"object","required":["workspace_name"],"title":"Body_switch_to_workspace_api_auth_switch_to_workspace_post"},"Body_sync_connection_general_api_init__connection_type___connection_id__post":{"properties":{"activate_all_tables":{"type":"boolean","title":"Activate All Tables","default":false},"table_filter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Table Filter"}},"type":"object","title":"Body_sync_connection_general_api_init__connection_type___connection_id__post"},"Body_tableau_extraction_status_api_tableau_extraction_status_post":{"properties":{"job_id":{"type":"string","title":"Job Id"}},"type":"object","required":["job_id"],"title":"Body_tableau_extraction_status_api_tableau_extraction_status_post"},"Body_tableau_metadata_graphql_api_tableau_metadata_graphql_post":{"properties":{"connection_id":{"type":"string","title":"Connection Id"},"query":{"type":"string","title":"Query"}},"type":"object","required":["connection_id","query"],"title":"Body_tableau_metadata_graphql_api_tableau_metadata_graphql_post"},"Body_tableau_workbook_views_api_tableau_workbook_views_post":{"properties":{"connection_id":{"type":"string","title":"Connection Id"},"workbook_id":{"type":"string","title":"Workbook Id"}},"type":"object","required":["connection_id","workbook_id"],"title":"Body_tableau_workbook_views_api_tableau_workbook_views_post"},"Body_take_over_doc_api_take_over_element_post":{"properties":{"id":{"type":"string","title":"Id"},"seed":{"type":"string","title":"Seed"}},"type":"object","required":["id","seed"],"title":"Body_take_over_doc_api_take_over_element_post"},"Body_test_immuta_api_test_immuta_post":{"properties":{"connection_id":{"type":"string","title":"Connection Id"},"userid":{"type":"string","title":"Userid"}},"type":"object","required":["connection_id"],"title":"Body_test_immuta_api_test_immuta_post"},"Body_test_secret_store_api_secret_stores_test_post":{"properties":{"store":{"additionalProperties":true,"type":"object","title":"Store"},"ref":{"type":"string","title":"Ref","default":""}},"type":"object","required":["store"],"title":"Body_test_secret_store_api_secret_stores_test_post"},"Body_test_smtp_settings_api_test_smtp_settings_post":{"properties":{"smtp_server":{"type":"string","title":"Smtp Server"},"smtp_port":{"type":"integer","title":"Smtp Port"},"smtp_username":{"type":"string","title":"Smtp Username"},"smtp_password":{"type":"string","title":"Smtp Password"},"smtp_from_address":{"type":"string","title":"Smtp From Address"},"smtp_from_name":{"type":"string","title":"Smtp From Name"},"smtp_app_name":{"type":"string","title":"Smtp App Name"}},"type":"object","required":["smtp_server","smtp_port","smtp_username","smtp_password","smtp_from_address","smtp_from_name","smtp_app_name"],"title":"Body_test_smtp_settings_api_test_smtp_settings_post"},"Body_transcribe_audio_api_transcribe_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"chat_id":{"type":"string","title":"Chat Id","default":""}},"type":"object","required":["file"],"title":"Body_transcribe_audio_api_transcribe_post"},"Body_trigger_sync_api_replication__config_id__sync_post":{"properties":{"full_refresh":{"type":"boolean","title":"Full Refresh","default":false}},"type":"object","title":"Body_trigger_sync_api_replication__config_id__sync_post"},"Body_unblock_doc_api_unblock_element_post":{"properties":{"id":{"type":"string","title":"Id"},"seed":{"type":"string","title":"Seed"}},"type":"object","required":["id","seed"],"title":"Body_unblock_doc_api_unblock_element_post"},"Body_update_activate_all_tables_api_connection_update_all_tables_post":{"properties":{"connection_id":{"type":"string","title":"Connection Id"},"activate_all_tables":{"type":"boolean","title":"Activate All Tables"}},"type":"object","required":["connection_id","activate_all_tables"],"title":"Body_update_activate_all_tables_api_connection_update_all_tables_post"},"Body_update_bigquery_settings_api_update_bigquery_settings_post":{"properties":{"connection_id":{"type":"string","title":"Connection Id"},"impersonate_user":{"type":"boolean","title":"Impersonate User"},"impersonate_non_sso":{"type":"boolean","title":"Impersonate Non Sso"}},"type":"object","required":["connection_id"],"title":"Body_update_bigquery_settings_api_update_bigquery_settings_post"},"Body_update_chat_history_archive_api_archive_chat_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"archive":{"type":"boolean","title":"Archive"},"confirm":{"type":"boolean","title":"Confirm"}},"type":"object","required":["chat_id","archive","confirm"],"title":"Body_update_chat_history_archive_api_archive_chat_post"},"Body_update_chat_history_delete_api_deleteMessage_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"message_position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Message Position"},"message_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Uuid"}},"type":"object","required":["chat_id"],"title":"Body_update_chat_history_delete_api_deleteMessage_post"},"Body_update_chat_history_feedback_api_feedback_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"message":{"additionalProperties":true,"type":"object","title":"Message"},"message_position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Message Position"},"message_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Uuid"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","default":""},"checkboxes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Checkboxes","default":[]},"trace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace Id","default":""}},"type":"object","required":["chat_id","message"],"title":"Body_update_chat_history_feedback_api_feedback_post"},"Body_update_chat_history_pin_api_pinChat_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"pin":{"type":"boolean","title":"Pin"}},"type":"object","required":["chat_id","pin"],"title":"Body_update_chat_history_pin_api_pinChat_post"},"Body_update_config_api_replication__config_id__put":{"properties":{"schedule_hours":{"type":"integer","title":"Schedule Hours"},"enabled":{"type":"boolean","title":"Enabled"},"credentials":{"additionalProperties":true,"type":"object","title":"Credentials"}},"type":"object","title":"Body_update_config_api_replication__config_id__put"},"Body_update_connection_groups_api_connection_update_groups_post":{"properties":{"connection_id":{"type":"string","title":"Connection Id"},"groups":{"items":{"type":"string"},"type":"array","title":"Groups"}},"type":"object","required":["connection_id","groups"],"title":"Body_update_connection_groups_api_connection_update_groups_post"},"Body_update_connector_skill_permissions_api_skills_connector__skill_name__permissions_patch":{"properties":{"permissions":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Permissions"}},"type":"object","required":["permissions"],"title":"Body_update_connector_skill_permissions_api_skills_connector__skill_name__permissions_patch"},"Body_update_connector_skill_scope_api_skills_connector__skill_name__groups_patch":{"properties":{"groups":{"items":{"type":"string"},"type":"array","title":"Groups"}},"type":"object","required":["groups"],"title":"Body_update_connector_skill_scope_api_skills_connector__skill_name__groups_patch"},"Body_update_feature_flags_api_feature_flags_put":{"properties":{"flags":{"additionalProperties":true,"type":"object","title":"Flags"}},"type":"object","required":["flags"],"title":"Body_update_feature_flags_api_feature_flags_put"},"Body_update_looker_settings_api_update_looker_settings_post":{"properties":{"connection_id":{"type":"string","title":"Connection Id"},"sync_looker_user_attributes":{"type":"boolean","title":"Sync Looker User Attributes"}},"type":"object","required":["connection_id"],"title":"Body_update_looker_settings_api_update_looker_settings_post"},"Body_update_note_template_api_note_templates__template_id__put":{"properties":{"title":{"type":"string","title":"Title"},"note":{"type":"string","title":"Note"}},"type":"object","required":["title","note"],"title":"Body_update_note_template_api_note_templates__template_id__put"},"Body_update_overage_settings_api_billing_overage_settings_post":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"cap_dollars":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cap Dollars"}},"type":"object","title":"Body_update_overage_settings_api_billing_overage_settings_post"},"Body_update_overwrite_comments_on_sync_api_connection_update_overwrite_comments_post":{"properties":{"connection_id":{"type":"string","title":"Connection Id"},"overwrite_comments_on_sync":{"type":"boolean","title":"Overwrite Comments On Sync"},"confirm":{"type":"boolean","title":"Confirm"}},"type":"object","required":["connection_id","overwrite_comments_on_sync","confirm"],"title":"Body_update_overwrite_comments_on_sync_api_connection_update_overwrite_comments_post"},"Body_update_ppt_template_api_update_ppt_template_post":{"properties":{"template_id":{"type":"string","title":"Template Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"guidelines":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guidelines"},"groups":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Groups"},"is_default":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Default"}},"type":"object","required":["template_id"],"title":"Body_update_ppt_template_api_update_ppt_template_post"},"Body_update_snowflake_settings_api_update_snowflake_settings_post":{"properties":{"account":{"type":"string","title":"Account"},"sync_snowflake_roles":{"type":"boolean","title":"Sync Snowflake Roles"},"sync_snowflake_user_roles":{"type":"boolean","title":"Sync Snowflake User Roles"},"use_secondary_roles":{"type":"boolean","title":"Use Secondary Roles"},"internal_marketplace_enabled":{"type":"boolean","title":"Internal Marketplace Enabled"},"immuta_governed":{"type":"boolean","title":"Immuta Governed"}},"type":"object","required":["account"],"title":"Body_update_snowflake_settings_api_update_snowflake_settings_post"},"Body_update_table_filter_api_connection_update_table_filter_post":{"properties":{"connection_id":{"type":"string","title":"Connection Id"},"table_filter":{"type":"string","title":"Table Filter"}},"type":"object","required":["connection_id","table_filter"],"title":"Body_update_table_filter_api_connection_update_table_filter_post"},"Body_update_user_adoption_target_api_update_user_adoption_target_post":{"properties":{"target":{"type":"integer","title":"Target"}},"type":"object","required":["target"],"title":"Body_update_user_adoption_target_api_update_user_adoption_target_post"},"Body_update_user_profile_api_auth_user_profile_put":{"properties":{"realname":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[\\w \\-]+$","title":"Realname"},"slack_title":{"type":"string","title":"Slack Title"}},"type":"object","required":["realname","slack_title"],"title":"Body_update_user_profile_api_auth_user_profile_put"},"Body_update_workspace_user_role_api_update_workspace_user_role_post":{"properties":{"user_email":{"type":"string","title":"User Email","description":"Email of the user to update"},"workspace_name":{"type":"string","title":"Workspace Name","description":"Name of the workspace"},"role":{"type":"string","title":"Role","description":"New role for the user"}},"type":"object","required":["user_email","workspace_name","role"],"title":"Body_update_workspace_user_role_api_update_workspace_user_role_post"},"Body_upload_file_to_chat_api_context_agent_chats__chat_id__upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_file_to_chat_api_context_agent_chats__chat_id__upload_post"},"Body_upload_files_api_upload_files_post":{"properties":{"files":{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array","title":"Files"},"is_private":{"type":"string","title":"Is Private"},"create_table":{"type":"boolean","title":"Create Table","default":true}},"type":"object","required":["files","is_private"],"title":"Body_upload_files_api_upload_files_post"},"Body_upload_logo_api_upload_logo_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_logo_api_upload_logo_post"},"Body_upload_ppt_template_api_upload_ppt_template_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_ppt_template_api_upload_ppt_template_post"},"Body_upload_skill_file_api_skills__skill_name__files_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_skill_file_api_skills__skill_name__files_post"},"Body_upload_to_chat_api_upload_to_chat_post":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["chat_id","file"],"title":"Body_upload_to_chat_api_upload_to_chat_post"},"Body_upsert_rls_attribute_api_rls_attributes_upsert_post":{"properties":{"name":{"type":"string","title":"Name"},"allow_default_source":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Allow Default Source"},"max_age_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Age Hours"}},"type":"object","required":["name"],"title":"Body_upsert_rls_attribute_api_rls_attributes_upsert_post"},"Body_validate_tableau_connected_app_api_validate_tableau_connected_app_post":{"properties":{"connection_id":{"type":"string","title":"Connection Id"},"view_content_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"View Content Url"}},"type":"object","required":["connection_id"],"title":"Body_validate_tableau_connected_app_api_validate_tableau_connected_app_post"},"Body_validate_teams_recipient_api_validate_teams_recipient_post":{"properties":{"recipient_id":{"type":"string","title":"Recipient Id"}},"type":"object","required":["recipient_id"],"title":"Body_validate_teams_recipient_api_validate_teams_recipient_post"},"Body_verify_user_api_auth_verify_post":{"properties":{"username":{"type":"string","title":"Username"},"token":{"type":"string","title":"Token"}},"type":"object","required":["username","token"],"title":"Body_verify_user_api_auth_verify_post"},"ChatDetailsResponse":{"properties":{"merge_policy":{"type":"string","enum":["selectable_files","full_environment"],"title":"Merge Policy"}},"additionalProperties":true,"type":"object","required":["merge_policy"],"title":"ChatDetailsResponse"},"ChatHistoryEntry":{"properties":{"id":{"type":"string","title":"Id","description":"Conversation ID within this workspace. Open it in the iframe using ?c=ID."},"first_question":{"type":"string","title":"First Question","description":"First question preview, with attachment/context tags removed, up to 200 characters."},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date","description":"Conversation creation timestamp, as stored by Dot."},"last_updated":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Updated","description":"Last conversation update timestamp, as stored by Dot."},"public":{"anyOf":[{"type":"boolean"},{"type":"integer"},{"type":"null"}],"title":"Public","description":"Whether the conversation is shared publicly. Legacy storage can return 0 or 1."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"Conversation title, or null if no title has been assigned."},"pinned":{"type":"boolean","title":"Pinned","description":"Whether the conversation is a favorite for its owner."},"messages_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Messages Length","description":"Stored message count, including assistant and tool messages."},"edits_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Edits Length","description":"Stored count of edits in this conversation."},"overall_feedback":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Overall Feedback","description":"Aggregate conversation feedback: positive for likes, negative for dislikes, or null if absent."},"labels":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Labels","description":"Conversation labels. SQLite metadata commonly returns a JSON-encoded array string; legacy values may be plain strings."},"agentic":{"type":"boolean","title":"Agentic","description":"Whether this conversation uses the multi-step agent."},"extra":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extra","description":"Latest opaque extra URL parameter saved with this conversation by the embedding application."},"archived":{"type":"boolean","title":"Archived","description":"Whether the conversation is archived."},"running":{"type":"boolean","title":"Running","description":"Whether an agentic run is currently active for this conversation."},"recently_completed":{"type":"boolean","title":"Recently Completed","description":"Whether a run completed recently and its completion indicator has not been dismissed."}},"type":"object","required":["id","first_question","pinned","agentic","archived","running","recently_completed"],"title":"ChatHistoryEntry","description":"Conversation metadata; load /api/c2/{id} for the transcript."},"ChatHistoryResponse":{"properties":{"chats":{"items":{"$ref":"#/components/schemas/ChatHistoryEntry"},"type":"array","title":"Chats","description":"Page of the caller's own conversation summaries. The first page also includes all unarchived favorites and up to 20 recent archived conversations; its total can exceed limit."},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Opaque cursor for the next page of unarchived, unpinned conversations. Pass it as cursor unchanged; null ends pagination."}},"type":"object","required":["chats","next_cursor"],"title":"ChatHistoryResponse"},"ChatSearchResponse":{"properties":{"chats":{"items":{"$ref":"#/components/schemas/ChatHistoryEntry"},"type":"array","title":"Chats","description":"Matching summaries from the caller's own conversations, including matches beyond the loaded history pages."}},"type":"object","required":["chats"],"title":"ChatSearchResponse"},"ConceptRef":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"source_system":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source System"},"concept_type":{"anyOf":[{"type":"string","enum":["metric","entity"]},{"type":"null"}],"title":"Concept Type"},"source":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Source"},"labels":{"items":{"type":"string"},"type":"array","title":"Labels"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"additionalProperties":false,"type":"object","title":"ConceptRef"},"CreateAppRequest":{"properties":{"source":{"type":"string","title":"Source"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename"},"folder":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder"},"shared":{"type":"boolean","title":"Shared","default":true},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path"},"chat_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Id"},"theme":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Theme"}},"type":"object","required":["source"],"title":"CreateAppRequest"},"CreateFolderRequest":{"properties":{"path":{"type":"string","title":"Path"}},"type":"object","required":["path"],"title":"CreateFolderRequest"},"CreateProject":{"properties":{"id":{"type":"string","title":"Id","default":"workspace"},"warehouse_connection_id":{"type":"string","title":"Warehouse Connection Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"additionalProperties":false,"type":"object","required":["warehouse_connection_id"],"title":"CreateProject"},"CreateWishRequest":{"properties":{"text":{"type":"string","maxLength":5000,"title":"Text"},"source":{"type":"string","enum":["cli","slack","ui","api"],"title":"Source","default":"api"}},"type":"object","required":["text"],"title":"CreateWishRequest"},"DashboardJobRemoveRequest":{"properties":{"app_id":{"type":"string","title":"App Id"}},"type":"object","required":["app_id"],"title":"DashboardJobRemoveRequest"},"DashboardJobRequest":{"properties":{"app_id":{"type":"string","title":"App Id"},"cron_args":{"additionalProperties":true,"type":"object","title":"Cron Args"}},"type":"object","required":["app_id","cron_args"],"title":"DashboardJobRequest"},"DeliveryModel":{"properties":{"channel":{"type":"string","title":"Channel"},"to":{"items":{"type":"string"},"type":"array","title":"To"},"attach_pdf":{"type":"boolean","title":"Attach Pdf","default":true},"pdf_layout":{"type":"string","enum":["pages","one_page"],"title":"Pdf Layout","default":"pages"},"embed_app":{"type":"boolean","title":"Embed App","default":false}},"type":"object","required":["channel","to"],"title":"DeliveryModel"},"DotSessionRequest":{"properties":{"task":{"type":"string","title":"Task"}},"type":"object","required":["task"],"title":"DotSessionRequest","description":"Body schema for POST /chats/{chat_id}/dot_session."},"EditChartRequest":{"properties":{"modification_request":{"type":"string","title":"Modification Request"},"param_values":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Param Values"},"prev_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prev Code"},"tile_column":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tile Column"}},"type":"object","required":["modification_request"],"title":"EditChartRequest"},"EnvironmentMergeApplyCommand":{"properties":{"operation":{"type":"string","const":"apply","title":"Operation"},"source":{"oneOf":[{"$ref":"#/components/schemas/ProductionMergeSource"},{"$ref":"#/components/schemas/EnvironmentMergeSource"}],"title":"Source","discriminator":{"propertyName":"kind","mapping":{"environment":"#/components/schemas/EnvironmentMergeSource","production":"#/components/schemas/ProductionMergeSource"}}},"destination":{"$ref":"#/components/schemas/EnvironmentMergeDestination"},"expected_source_head":{"type":"string","maxLength":64,"minLength":40,"pattern":"^[0-9a-fA-F]+$","title":"Expected Source Head"},"expected_destination_head":{"type":"string","maxLength":64,"minLength":40,"pattern":"^[0-9a-fA-F]+$","title":"Expected Destination Head"},"resolved_conflict_paths":{"items":{"type":"string","maxLength":512,"minLength":1},"type":"array","maxItems":200,"title":"Resolved Conflict Paths"}},"additionalProperties":false,"type":"object","required":["operation","source","destination","expected_source_head","expected_destination_head"],"title":"EnvironmentMergeApplyCommand"},"EnvironmentMergeDestination":{"properties":{"kind":{"type":"string","const":"environment","title":"Kind"},"environment_id":{"type":"string","maxLength":128,"minLength":1,"title":"Environment Id"}},"additionalProperties":false,"type":"object","required":["kind","environment_id"],"title":"EnvironmentMergeDestination"},"EnvironmentMergePreviewCommand":{"properties":{"operation":{"type":"string","const":"preview","title":"Operation"},"source":{"oneOf":[{"$ref":"#/components/schemas/ProductionMergeSource"},{"$ref":"#/components/schemas/EnvironmentMergeSource"}],"title":"Source","discriminator":{"propertyName":"kind","mapping":{"environment":"#/components/schemas/EnvironmentMergeSource","production":"#/components/schemas/ProductionMergeSource"}}},"destination":{"$ref":"#/components/schemas/EnvironmentMergeDestination"}},"additionalProperties":false,"type":"object","required":["operation","source","destination"],"title":"EnvironmentMergePreviewCommand"},"EnvironmentMergeSource":{"properties":{"kind":{"type":"string","const":"environment","title":"Kind"},"environment_id":{"type":"string","maxLength":128,"minLength":1,"title":"Environment Id"}},"additionalProperties":false,"type":"object","required":["kind","environment_id"],"title":"EnvironmentMergeSource"},"EnvironmentProposalResponse":{"properties":{"proposal_id":{"type":"string","title":"Proposal Id"},"proposal_source":{"type":"string","enum":["environment","training"],"title":"Proposal Source"},"merge_policy":{"type":"string","const":"full_environment","title":"Merge Policy"},"score_pct":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Score Pct"},"threshold":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Threshold"},"below_threshold":{"type":"boolean","title":"Below Threshold"},"pull_request_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pull Request Url"},"next_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Step"}},"type":"object","required":["proposal_id","proposal_source","merge_policy","score_pct","threshold","below_threshold"],"title":"EnvironmentProposalResponse"},"EvaluationCreateRequest":{"properties":{"target":{"anyOf":[{"$ref":"#/components/schemas/EvaluationTarget"},{"type":"null"}],"description":"Legacy CLI compatibility: must match X-Dot-Environment. Select the run target when starting a run.","deprecated":true},"name":{"type":"string","maxLength":160,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"questions":{"items":{"$ref":"#/components/schemas/EvaluationQuestionCreateRequest"},"type":"array","minItems":1,"title":"Questions"},"source_chat_id":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Source Chat Id"}},"additionalProperties":false,"type":"object","required":["name","questions"],"title":"EvaluationCreateRequest"},"EvaluationPrepareRequest":{"properties":{"source":{"type":"string","enum":["questions","csv","values"],"title":"Source"},"questions":{"anyOf":[{"items":{"$ref":"#/components/schemas/GroundTruthQuestionRequest"},"type":"array"},{"type":"null"}],"title":"Questions"},"values":{"anyOf":[{"items":{"$ref":"#/components/schemas/GroundTruthValueRequest"},"type":"array"},{"type":"null"}],"title":"Values"},"text":{"anyOf":[{"type":"string","maxLength":5242880},{"type":"null"}],"title":"Text"},"file_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"File Name"},"cover_all_slices":{"type":"boolean","title":"Cover All Slices","default":false}},"additionalProperties":false,"type":"object","required":["source"],"title":"EvaluationPrepareRequest"},"EvaluationQuestionCreateRequest":{"properties":{"concept_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Concept Id"},"concept_name":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Concept Name"},"question":{"type":"string","maxLength":1000,"minLength":1,"title":"Question"},"expected_answer":{"type":"string","maxLength":1000,"minLength":1,"title":"Expected Answer"},"answer_type":{"type":"string","enum":["number","currency","percent","count","ratio","date"],"title":"Answer Type","default":"number"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"tolerance_pct":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Tolerance Pct","default":3.0},"source":{"$ref":"#/components/schemas/QuestionSource"}},"additionalProperties":false,"type":"object","required":["question","expected_answer"],"title":"EvaluationQuestionCreateRequest"},"EvaluationQuestionUpdateRequest":{"properties":{"concept_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Concept Id"},"concept_name":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Concept Name"},"question":{"anyOf":[{"type":"string","maxLength":1000,"minLength":1},{"type":"null"}],"title":"Question"},"expected_answer":{"anyOf":[{"type":"string","maxLength":1000,"minLength":1},{"type":"null"}],"title":"Expected Answer"},"answer_type":{"anyOf":[{"type":"string","enum":["number","currency","percent","count","ratio","date"]},{"type":"null"}],"title":"Answer Type"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"tolerance_pct":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Tolerance Pct"},"source":{"anyOf":[{"$ref":"#/components/schemas/QuestionSource"},{"type":"null"}]}},"additionalProperties":false,"type":"object","title":"EvaluationQuestionUpdateRequest"},"EvaluationRunCreateRequest":{"properties":{"target":{"anyOf":[{"$ref":"#/components/schemas/EvaluationTarget"},{"type":"null"}]},"questions":{"anyOf":[{"items":{"$ref":"#/components/schemas/EvaluationRunQuestionRequest"},"type":"array","minItems":1},{"type":"null"}],"title":"Questions","description":"Optional run-only question snapshot. Omit to use the saved evaluation; supplied cases never edit it."},"idempotency_key":{"anyOf":[{"type":"string","maxLength":200,"minLength":1,"pattern":"^\\S+$"},{"type":"null"}],"title":"Idempotency Key","description":"Same key and request returns the accepted run. Reusing a key with different input returns 409. Use a new key for a new CI attempt."},"expected_target_commit":{"anyOf":[{"type":"string","pattern":"^[0-9a-f]{40}$"},{"type":"null"}],"title":"Expected Target Commit","description":"Full Dot context Git commit required at submission. A mismatch returns 409 before execution; this is not the customer repository SHA."},"trigger":{"type":"string","enum":["manual","api","cli"],"title":"Trigger","default":"manual"},"metadata":{"additionalProperties":{"type":"string"},"type":"object","title":"Metadata"}},"additionalProperties":false,"type":"object","title":"EvaluationRunCreateRequest"},"EvaluationRunQuestionRequest":{"properties":{"concept_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Concept Id"},"concept_name":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Concept Name"},"question":{"type":"string","maxLength":1000,"minLength":1,"title":"Question"},"expected_answer":{"type":"string","maxLength":1000,"minLength":1,"title":"Expected Answer"},"answer_type":{"type":"string","enum":["number","currency","percent","count","ratio","date"],"title":"Answer Type","default":"number"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"tolerance_pct":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Tolerance Pct","default":3.0},"source":{"$ref":"#/components/schemas/QuestionSource"},"id":{"type":"string","maxLength":160,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9_.:-]*$","title":"Id"}},"additionalProperties":false,"type":"object","required":["question","expected_answer","id"],"title":"EvaluationRunQuestionRequest","description":"A Git-managed case has an identity independent of stored metric rows."},"EvaluationTarget":{"properties":{"kind":{"type":"string","enum":["production","environment"],"title":"Kind","default":"production"},"environment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Environment Id"}},"additionalProperties":false,"type":"object","title":"EvaluationTarget"},"EvaluationUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":160,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"}},"additionalProperties":false,"type":"object","title":"EvaluationUpdateRequest"},"ExportAppViewsResponse":{"properties":{"tracking_since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tracking Since","description":"UTC timestamp when view counting started for this organization, ISO 8601 format. Views before it were not recorded. With `include_all_workspaces=true`, the earliest start among the included workspaces. Null when nothing has been viewed yet."},"views":{"items":{"$ref":"#/components/schemas/AppViewRow"},"type":"array","title":"Views","description":"One row per app and viewer, plus one row per app for its public-link visitors. Rows are grouped by app, and within an app the most views come first. Archived apps are included; an app nobody has opened since `tracking_since` has no rows."}},"type":"object","required":["views"],"title":"ExportAppViewsResponse","description":"Everything returned by `/api/export_app_views`."},"ExportHistoryResponse":{"properties":{"chats":{"items":{"$ref":"#/components/schemas/UserQueryRow"},"type":"array","title":"Chats","description":"One entry per user query (message turn) in the requested date range, ordered by `start_time` ascending."}},"type":"object","required":["chats"],"title":"ExportHistoryResponse","description":"Wrapper around the list of rows returned by `/api/export_history`."},"FolderPermissionsRequest":{"properties":{"view":{"items":{"type":"string"},"type":"array","title":"View","default":["all_users"]},"edit":{"items":{"type":"string"},"type":"array","title":"Edit","default":[]}},"type":"object","title":"FolderPermissionsRequest"},"GroundTruthQuestionRequest":{"properties":{"question":{"type":"string","maxLength":1000,"minLength":1,"title":"Question"},"expected_answer":{"type":"string","maxLength":1000,"minLength":1,"title":"Expected Answer"},"answer_type":{"anyOf":[{"type":"string","enum":["number","currency","percent","count","ratio","date"]},{"type":"null"}],"title":"Answer Type"},"unit":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Unit"},"tolerance_pct":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Tolerance Pct","default":3.0}},"additionalProperties":false,"type":"object","required":["question","expected_answer"],"title":"GroundTruthQuestionRequest"},"GroundTruthValueRequest":{"properties":{"metric":{"type":"string","maxLength":300,"minLength":1,"title":"Metric"},"question":{"anyOf":[{"type":"string","maxLength":1000,"minLength":1},{"type":"null"}],"title":"Question"},"value":{"type":"string","maxLength":200,"minLength":1,"title":"Value"},"period":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Period"},"answer_type":{"type":"string","enum":["number","currency","percent","count","ratio","date"],"title":"Answer Type","default":"number"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"tolerance_pct":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Tolerance Pct","default":3.0},"category":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Category"},"source":{"$ref":"#/components/schemas/PublicQuestionSource"}},"additionalProperties":false,"type":"object","required":["metric","value"],"title":"GroundTruthValueRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImportFilesRequest":{"properties":{"source_chat_id":{"type":"string","title":"Source Chat Id"},"files":{"items":{"$ref":"#/components/schemas/AttachedFile"},"type":"array","title":"Files"}},"type":"object","required":["source_chat_id","files"],"title":"ImportFilesRequest","description":"Body for copying uploads from one chat to another (429 recovery)."},"JobTestRequest":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"recipients":{"items":{"type":"string"},"type":"array","title":"Recipients"},"type":{"type":"string","title":"Type","default":"email"},"message_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Uuid"},"send_full_result":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Send Full Result"},"attach_files_to_root":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Attach Files To Root"},"work":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Work"},"attach_pdf":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Attach Pdf"}},"type":"object","required":["chat_id","recipients"],"title":"JobTestRequest"},"MessageJobRequest":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"message_uuid":{"type":"string","title":"Message Uuid"},"recipients":{"items":{"type":"string"},"type":"array","title":"Recipients"},"cron_args":{"additionalProperties":true,"type":"object","title":"Cron Args"},"type":{"type":"string","title":"Type","default":"email"},"owner_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Id"},"result_gate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result Gate"},"send_full_result":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Send Full Result"},"attach_files_to_root":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Attach Files To Root"},"work":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Work"},"attach_pdf":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Attach Pdf"},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"}},"type":"object","required":["chat_id","message_uuid","recipients","cron_args"],"title":"MessageJobRequest"},"MidflightMessageBody":{"properties":{"message":{"type":"string","title":"Message"},"ui_context":{"anyOf":[{"$ref":"#/components/schemas/UiContext"},{"type":"null"}]}},"type":"object","required":["message"],"title":"MidflightMessageBody"},"MoveAppRequest":{"properties":{"to_shared":{"type":"boolean","title":"To Shared","default":true},"folder":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Folder"}},"type":"object","title":"MoveAppRequest"},"MoveFolderRequest":{"properties":{"target":{"type":"string","title":"Target"}},"type":"object","required":["target"],"title":"MoveFolderRequest"},"PreviewNoteFilterRequest":{"properties":{"questions":{"items":{"type":"string"},"type":"array","title":"Questions"},"source":{"type":"string","title":"Source","default":"worktree"},"groups":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Groups"}},"type":"object","required":["questions"],"title":"PreviewNoteFilterRequest","description":"Body schema for POST /preview-note-filter.\n\nIntentionally narrow: just the questions to test, plus optional knobs for\nwhere to read notes from and whose groups to filter as."},"PreviewRequest":{"properties":{"source":{"type":"string","title":"Source"},"param_values":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Param Values"},"skip_artifacts":{"type":"boolean","title":"Skip Artifacts","default":true},"app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id"},"chat_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Id"},"refresh":{"type":"boolean","title":"Refresh","default":true},"tabs":{"title":"Tabs"}},"type":"object","required":["source"],"title":"PreviewRequest"},"ProductionMergeSource":{"properties":{"kind":{"type":"string","const":"production","title":"Kind"}},"additionalProperties":false,"type":"object","required":["kind"],"title":"ProductionMergeSource"},"PublicAppRuntimeRequest":{"properties":{"build_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Build Id"},"param_values":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Param Values"},"refresh":{"type":"boolean","title":"Refresh","default":false},"tabs":{"title":"Tabs"},"stale_first":{"type":"boolean","title":"Stale First","default":false},"structure_only":{"type":"boolean","title":"Structure Only","default":false},"verify_scripts":{"type":"boolean","title":"Verify Scripts","default":false}},"type":"object","title":"PublicAppRuntimeRequest"},"PublicQuestionSource":{"properties":{"system":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"System"},"workbook":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Workbook"},"view":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"View"},"dashboard_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Dashboard Name"},"dashboard_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Dashboard Url"},"dashboard_id":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Dashboard Id"},"tile_id":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Tile Id"},"look_id":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Look Id"},"query_id":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Query Id"},"method":{"anyOf":[{"type":"string","enum":["tile_read","reconstructed"]},{"type":"null"}],"title":"Method"},"reconstruction_accepted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reconstruction Accepted"},"compiled_sql":{"anyOf":[{"type":"string","maxLength":20000},{"type":"null"}],"title":"Compiled Sql"},"filters":{"additionalProperties":{"type":"string"},"type":"object","title":"Filters"},"question_filters":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Question Filters"},"extracted_at":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Extracted At"},"definition":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Definition"},"legacy_run_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legacy Run Status"},"legacy_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legacy Run Id"},"connection_id":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Connection Id"},"worksheet":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Worksheet"},"category":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Category"},"expected_period":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Expected Period"},"metric":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Metric"}},"additionalProperties":false,"type":"object","title":"PublicQuestionSource"},"PublicTrainingRunConfig":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Name"},"credit_limit_acc":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Credit Limit Acc"},"evaluation_name":{"anyOf":[{"type":"string","maxLength":160,"minLength":1},{"type":"null"}],"title":"Evaluation Name"},"target_score_pct":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Target Score Pct","default":100},"ground_truth_values":{"anyOf":[{"items":{"$ref":"#/components/schemas/GroundTruthValueRequest"},"type":"array","maxItems":100,"minItems":1},{"type":"null"}],"title":"Ground Truth Values"},"source_chat_id":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Source Chat Id"},"start_from":{"$ref":"#/components/schemas/TrainingStartPoint"},"guidance":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Guidance"},"fast":{"type":"boolean","title":"Fast","default":false}},"additionalProperties":false,"type":"object","title":"PublicTrainingRunConfig"},"PublishRequest":{"properties":{"chat_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Id"},"theme":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Theme"},"source_sha":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Sha"}},"type":"object","title":"PublishRequest","description":"Payload for /apps/{app_id}/publish.\n\nEvery publish flows through the chat-session pathway: the frontend\nseeds a session from the published source on Edit-click if needed,\nthe user's edits land in the session, and publish promotes the\nchat draft's lint artifacts to the published namespace.\n\n`chat_id` is required. The legacy \"editor publish\" path (separate\n`.draft` file, build-from-disk fallback) was retired — see plan\n`~/.claude/plans/starry-wishing-umbrella.md` Phase C.\n\n`theme` is the Style-panel's current state at publish time. The\nbackend applies it as a last-write-wins overlay so a debounced\n`/theme` write that lost a race can't silently revert the user's\npick (Bug V).\n\n`source_sha`, when given, is the draft version the publisher saw: a draft\nthat changed since is refused under the draft's lock instead of published."},"QuestionSeed":{"properties":{"question":{"type":"string","title":"Question"},"concept_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Concept Id"},"concept_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Concept Slug"},"expected_answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Answer"},"answer_type":{"type":"string","enum":["number","currency","percent","count","ratio","date","text"],"title":"Answer Type","default":"number"},"source":{"$ref":"#/components/schemas/QuestionSource"}},"additionalProperties":false,"type":"object","required":["question"],"title":"QuestionSeed"},"QuestionSource":{"properties":{"system":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System"},"workbook":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workbook"},"view":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"View"},"dashboard_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dashboard Name"},"dashboard_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dashboard Url"},"dashboard_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dashboard Id"},"tile_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tile Id"},"look_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Look Id"},"query_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query Id"},"method":{"anyOf":[{"type":"string","enum":["tile_read","reconstructed"]},{"type":"null"}],"title":"Method"},"reconstruction_accepted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reconstruction Accepted"},"compiled_sql":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compiled Sql"},"filters":{"additionalProperties":{"type":"string"},"type":"object","title":"Filters"},"question_filters":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Question Filters"},"extracted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extracted At"},"definition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Definition"},"legacy_run_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legacy Run Status"},"legacy_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Legacy Run Id"}},"additionalProperties":true,"type":"object","title":"QuestionSource"},"RefactorLockRequest":{"properties":{"renames":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Renames","default":[]},"dry_run":{"type":"boolean","title":"Dry Run","default":false}},"type":"object","title":"RefactorLockRequest","description":"Mechanical rename spec: entries of {column, new_column, table?} and/or\n{table, new_table}."},"Relationship":{"properties":{"relationship_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Relationship Id"},"doc_id":{"type":"string","title":"Doc Id"},"table":{"type":"string","title":"Table"},"own_columns":{"items":{"type":"string"},"type":"array","title":"Own Columns"},"columns":{"items":{"type":"string"},"type":"array","title":"Columns"},"type":{"type":"string","title":"Type"},"active":{"type":"boolean","title":"Active","default":false},"incoming":{"type":"boolean","title":"Incoming","default":false}},"type":"object","required":["doc_id","table","own_columns","columns","type"],"title":"Relationship"},"RenameAppRequest":{"properties":{"title":{"type":"string","title":"Title"}},"type":"object","required":["title"],"title":"RenameAppRequest"},"RenameFolderRequest":{"properties":{"new_name":{"type":"string","title":"New Name"}},"type":"object","required":["new_name"],"title":"RenameFolderRequest"},"ResumeTrainingRunRequest":{"properties":{"credit_limit_acc":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Credit Limit Acc"},"option_value":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Option Value"},"context":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Context"}},"type":"object","title":"ResumeTrainingRunRequest"},"RlsPreviewCountRequest":{"properties":{"user_id":{"type":"string","title":"User Id"},"doc_id":{"type":"string","title":"Doc Id"},"expression":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expression"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"type":"object","required":["user_id","doc_id"],"title":"RlsPreviewCountRequest"},"RlsValidationRequest":{"properties":{"doc_id":{"type":"string","title":"Doc Id"},"expression":{"type":"string","title":"Expression"},"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","required":["doc_id","expression"],"title":"RlsValidationRequest"},"RuntimeErrorRecord":{"properties":{"kind":{"type":"string","title":"Kind","default":""},"message":{"type":"string","title":"Message","default":""},"name":{"type":"string","title":"Name","default":""},"source":{"type":"string","title":"Source","default":""},"lineno":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lineno"},"colno":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Colno"},"stack":{"type":"string","title":"Stack","default":""},"blockedURI":{"type":"string","title":"Blockeduri","default":""},"violatedDirective":{"type":"string","title":"Violateddirective","default":""},"ts":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ts"}},"type":"object","title":"RuntimeErrorRecord"},"RuntimeErrorsRequest":{"properties":{"source_sha":{"type":"string","title":"Source Sha"},"errors":{"items":{"$ref":"#/components/schemas/RuntimeErrorRecord"},"type":"array","title":"Errors","default":[]}},"type":"object","required":["source_sha"],"title":"RuntimeErrorsRequest"},"SaveChartEditRequest":{"properties":{"cache_token":{"type":"string","title":"Cache Token"},"init_from_app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Init From App Id"}},"type":"object","required":["cache_token"],"title":"SaveChartEditRequest"},"ScheduleDefRequest":{"properties":{"app_id":{"type":"string","title":"App Id"},"schedule_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule Id"},"every":{"type":"string","title":"Every"},"at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"At"},"on":{"anyOf":[{},{"type":"null"}],"title":"On"},"timezone":{"type":"string","title":"Timezone","default":"UTC"},"work":{"type":"string","title":"Work","default":"latest"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"result_gate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result Gate"},"cards":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Cards"},"params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Params"},"trigger":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Trigger"},"owner_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Id"},"deliveries":{"items":{"$ref":"#/components/schemas/DeliveryModel"},"type":"array","title":"Deliveries","default":[]},"paused":{"type":"boolean","title":"Paused","default":false}},"type":"object","required":["app_id","every"],"title":"ScheduleDefRequest"},"SetSessionThemeRequest":{"properties":{"theme":{"additionalProperties":true,"type":"object","title":"Theme"},"init_from_app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Init From App Id"}},"type":"object","required":["theme"],"title":"SetSessionThemeRequest"},"StartTrainingRunRequest":{"properties":{"config":{"$ref":"#/components/schemas/PublicTrainingRunConfig"}},"type":"object","title":"StartTrainingRunRequest"},"StreamRequestBody":{"properties":{"message":{"type":"string","title":"Message"},"attached_files":{"anyOf":[{"items":{"$ref":"#/components/schemas/AttachedFile"},"type":"array"},{"type":"null"}],"title":"Attached Files"},"ui_context":{"anyOf":[{"$ref":"#/components/schemas/UiContext"},{"type":"null"}]}},"type":"object","required":["message"],"title":"StreamRequestBody","description":"Request body for stream endpoint with optional attached files."},"SurveyResponse":{"properties":{"role":{"type":"string","title":"Role"},"intent":{"type":"string","title":"Intent"}},"type":"object","required":["role","intent"],"title":"SurveyResponse"},"SyncJobRequest":{"properties":{"connection_type":{"type":"string","title":"Connection Type"},"connection_id":{"type":"string","title":"Connection Id"},"cron_args":{"additionalProperties":true,"type":"object","title":"Cron Args"},"refresh_samples":{"type":"boolean","title":"Refresh Samples","default":false}},"type":"object","required":["connection_type","connection_id","cron_args"],"title":"SyncJobRequest"},"TestGateRequest":{"properties":{"chat_id":{"type":"string","title":"Chat Id"},"message_uuid":{"type":"string","title":"Message Uuid"}},"type":"object","required":["chat_id","message_uuid"],"title":"TestGateRequest"},"TicketActionRequest":{"properties":{"action":{"type":"string","title":"Action"},"chat_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Id"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"evidence_chat_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Evidence Chat Ids"},"ticket_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ticket Id"}},"type":"object","required":["action"],"title":"TicketActionRequest","description":"Body for POST /ticket_action. The agent ends a propose run with exactly one\naction: list (dedup), publish (a new ticket), or duplicate (bump an existing one).\n\nchat_id is the agent's own session, baked into its helper from $CHAT_ID — the LLM\nnever types an id; ticket_id (for duplicate) comes straight from a prior list."},"TrainingCreateRequest":{"properties":{"name":{"type":"string","title":"Name"},"credit_limit_acc":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Credit Limit Acc"},"source_type":{"type":"string","enum":["bi","file","custom"],"title":"Source Type","default":"custom"},"start_from":{"$ref":"#/components/schemas/TrainingStartPoint"},"source_chat_id":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Source Chat Id"},"evaluation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evaluation Id"},"evaluation_name":{"anyOf":[{"type":"string","maxLength":160,"minLength":1},{"type":"null"}],"title":"Evaluation Name"},"confirm_fresh_baseline":{"type":"boolean","title":"Confirm Fresh Baseline","default":false},"source":{"$ref":"#/components/schemas/TrainingSource"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"concepts":{"items":{"$ref":"#/components/schemas/ConceptRef"},"type":"array","title":"Concepts"},"questions":{"items":{"$ref":"#/components/schemas/QuestionSeed"},"type":"array","title":"Questions"},"ground_truth_values":{"items":{"$ref":"#/components/schemas/GroundTruthValueRequest"},"type":"array","maxItems":100,"title":"Ground Truth Values"},"ground_truth_questions":{"items":{"$ref":"#/components/schemas/GroundTruthQuestionRequest"},"type":"array","maxItems":100,"title":"Ground Truth Questions"},"cover_all_slices":{"type":"boolean","title":"Cover All Slices","default":false},"fast":{"type":"boolean","title":"Fast","default":false}},"additionalProperties":false,"type":"object","required":["name"],"title":"TrainingCreateRequest"},"TrainingSource":{"properties":{"type":{"type":"string","title":"Type","default":"custom"},"dashboard_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dashboard Name"},"dashboard_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dashboard Url"},"workbook":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workbook"},"view":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"View"}},"additionalProperties":true,"type":"object","title":"TrainingSource"},"TrainingStartPoint":{"properties":{"kind":{"type":"string","enum":["inherit","production","environment"],"title":"Kind","default":"inherit"},"environment_id":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Environment Id"}},"additionalProperties":false,"type":"object","title":"TrainingStartPoint"},"TrainingUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":160,"minLength":1},{"type":"null"}],"title":"Name"},"credit_limit_acc":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Credit Limit Acc"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"source":{"anyOf":[{"$ref":"#/components/schemas/TrainingSource"},{"type":"null"}]}},"additionalProperties":false,"type":"object","title":"TrainingUpdateRequest"},"TransferOwnerRequest":{"properties":{"owner":{"type":"string","title":"Owner"}},"type":"object","required":["owner"],"title":"TransferOwnerRequest"},"UiContext":{"properties":{"page":{"type":"string","maxLength":64,"title":"Page"},"evaluation_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Evaluation Id"},"training_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Training Id"},"file":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"File"}},"type":"object","required":["page"],"title":"UiContext"},"UpdateAppRequest":{"properties":{"source":{"type":"string","title":"Source"},"expected_source_digest":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Source Digest"}},"type":"object","required":["source"],"title":"UpdateAppRequest"},"UserQueryRow":{"properties":{"message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Id","description":"Unique ID of this single user query (one message turn). Stable across the lifetime of the row. For an agentic answer it is also the answer's ID in the chat, so `<Dot URL>/?c={chat_id}&message_uuid={message_id}` opens the chat at this answer (use it to link a row, such as a thumbs-down, straight to the answer it rates)."},"org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Id","description":"ID of the organization that owns this query. For workspaces, this is the workspace org ID (e.g. 'getdot.ai-w-cause')."},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region","description":"Region of the Dot deployment that processed the query and answers this export: 'US' or 'EU' on Dot's hosted service, where an organization present in both regions exports each region's queries from that region. A self-hosted deployment reports its own region setting, 'local' when it has none."},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id","description":"Internal Dot user ID of the person who asked the question. For workspace users this is suffixed with `#{workspace_name}`."},"external_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External User Id","description":"The original/external identifier of the user (e.g. Slack user ID, email) before Dot's internal mapping."},"chat_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Id","description":"ID of the chat (conversation) this query belongs to. NOTE: chat IDs are only unique within a single workspace, not globally across workspaces."},"extra":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extra","description":"Latest extra embed parameter on the conversation identified by chat_id. Scheduled runs without their own value fall back to their source conversation via lineage_parent_id. An opaque host-supplied string, not a per-query snapshot; null when unavailable."},"user_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Message","description":"The natural-language question the user asked."},"answer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Answer","description":"The answer to this question as the user read it: its text, with each table, chart or file it showed named in brackets (e.g. '[DATA TABLE shown to the user]'). Only filled when the export was requested with `include_answers=true`. Null when no saved answer matches this question, for example a Root (context agent) row, a scheduled delivery, or a question still running."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Lifecycle status of the query. Common values: 'started' (the query began and is still in flight), 'completed' (finished successfully), 'failed' (raised an error, was interrupted before finishing, or was abandoned, with the reason in `error`), 'timeout' (agentic run hit the time limit before producing a final answer). A run that dies without reporting an outcome is reconciled to 'failed' within a few hours, so 'started' does not persist. Rows recorded before 2026-04-25 predate this column and were backfilled from `error`: 'completed' when no error was recorded, 'failed' otherwise."},"result_data_rows":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Result Data Rows","description":"Number of rows returned by the underlying SQL query, if the query produced a tabular result."},"result_data_columns":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result Data Columns","description":"Comma-separated list of column names returned by the SQL result."},"result_viz":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Result Viz","description":"Type of visualization rendered for the result (e.g. 'bar', 'line', 'table'). Empty when the answer was text-only."},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if the query failed. Null when the query completed successfully. Two values are recorded by the platform rather than the query itself: 'Run was interrupted before it finished' (the run was cancelled or stalled mid-flight) and 'finalizer_missing' (the run stopped reporting and was reconciled afterwards). Consult `acc_actual` for the billed amount; a stalled run may have consumed billable credits before it stopped."},"warning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Warning","description":"Non-fatal warning surfaced during the run (e.g. ambiguous column resolution, partial result). The query still completed."},"start_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Time","description":"UTC timestamp when the query started, ISO 8601 format. This is the field used to filter the export by date range."},"end_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Time","description":"UTC timestamp when the query finished, ISO 8601 format. Null while the query is still running."},"tokens_used":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tokens Used","description":"Not recorded in this export: always null. Use `acc_consumed` and `acc_actual` for what a query cost."},"connection_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connection Type","description":"Type of the data connection used (e.g. 'snowflake', 'bigquery', 'postgres', 'duckdb'). Null for non-SQL answers."},"channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel","description":"Where the query came from. Common values: 'ui' / 'web' (Dot web app), 'slack' (Slack bot), 'teams' (Microsoft Teams bot), 'email' (email reply), 'cli' (Dot CLI), 'mcp' (MCP integration), 'context_agent' (Root agent), 'schedule' (scheduled run). New channels can appear as new integrations ship."},"groups":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Groups","description":"The asking user's group memberships at query time, copied from the user record. Used for access control. Stored as plain text. The shape depends on how the user object was configured (usually a comma-separated list of group names, but can be empty or null)."},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role","description":"Role of the asking user at query time. One of 'admin', 'modeler', 'user'."},"agentic":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Agentic","description":"True if the query ran in agentic mode (multi-step tool-using agent). False for direct single-shot SQL generation."},"is_scheduled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Scheduled","description":"True if THIS specific query run was triggered by the scheduler (a cron-like recurring run), not by a human. Same as `created_by_schedule`."},"created_by_schedule":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Created By Schedule","description":"Customer-facing alias of `is_scheduled`. True if this specific query was triggered by the scheduler. Provided so consumers don't have to disambiguate the raw column name."},"has_schedule":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Schedule","description":"True if the PARENT CHAT has one or more active schedules attached, meaning it can run automatically in the future. Independent of whether this particular row was scheduled. Same as `has_active_schedule`."},"has_active_schedule":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Active Schedule","description":"Customer-facing alias of `has_schedule`. True if the parent chat has at least one active schedule and can therefore run automatically."},"lineage_parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lineage Parent Id","description":"For runs the scheduler generated, this is the `chat_id` of the source (template) chat the scheduled run came from, so you can reconcile a run back to the chat that defined it. A scheduled app delivery on the Latest numbers or Brief tier points at its schedule instead, as `scheddef-<schedule id>`: every run of one schedule shares it, though it names a chat only when the schedule has one. Null for queries that have no upstream lineage. Note: this column is generic enough that other code paths can populate it from their own metadata, so we cannot guarantee 100% that every value is a chat_id."},"parent_chat_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Chat Id","description":"The identifier the parent chat references. For chats created as a scheduled run output, or chats explicitly forked from another chat, this is normally the source `chat_id`. KNOWN ISSUE: for some scheduled-run paths (e.g. work-gate-blocked runs) this currently holds a message UUID instead of a chat_id. We are aware of this and tracking a cleanup; treat the value as 'a reference into the system' rather than strictly a chat_id."},"is_shared":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Shared","description":"True if the chat this query belongs to was shared with Dot's Share button, or if the query is an agentic scheduled run (`created_by_schedule` and `agentic` both true). Agentic runs are saved with an open link for their delivery, so they count even when the delivery was suppressed or sent without a link. A non-agentic scheduled run reports false: its delivery links to the source chat instead, which the scheduler shares, so that chat reports true."},"labels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Labels","description":"Free-form labels attached to the chat in the Dot UI. Useful for grouping (e.g. 'production', 'experiment')."},"chat_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Kind","description":"What the conversation this query belongs to was for: 'app' when it built or edited a Dot app, 'chat' otherwise. 'app' covers every conversation in the app editor or started by MCP `build_app`, every conversation an app was created or published from, and any other conversation in which Dot wrote an app (on the web, in Slack, Teams or email, through the API or MCP, or in a scheduled run). Set per conversation, not per query: every query of a conversation that built an app reports 'app', including questions asked in it before or after the app was built. Sum `acc_actual` (or `acc_consumed` where it is null) by this field to split what building apps cost from what questions cost. Questions asked about an app with its Ask button, Root (context agent) rows and rows of deleted conversations report 'chat'. A conversation in which Dot wrote an app outside the editor before this field was added reports 'chat', unless an app was created or published from it."},"acc_consumed":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Acc Consumed","description":"Credits (ACC) this query cost to run, including subagents and web searches. On a cancelled run this can exceed `acc_actual`."},"acc_actual":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Acc Actual","description":"Credits (ACC) billed to the org for this query. NULL on older rows and on Root (context agent) rows; use `acc_consumed` there."},"web_search_credits":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Web Search Credits","description":"Credits within this query attributable specifically to Dot's web-search tool. This is a subset of the query's total credits and is charged at a static 0.025 ACC per search. Null for rows recorded before this breakdown was tracked."},"feedback":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback","description":"Thumbs-up / thumbs-down feedback the user left on the answer. Values: 'like' (thumbs up), 'dislike' (thumbs down), or null if no feedback was given."},"feedback_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Feedback Data","description":"Structured feedback details: `{'description': str, 'checkboxes': list[str]}`. Populated when the user submitted the detailed feedback form."},"feedback_timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feedback Timestamp","description":"UTC timestamp of when the user submitted feedback, ISO 8601 format. Null if no feedback was given."},"conversation_score":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversation Score","description":"AI-judged quality score of the full conversation. Values: 'problem' (the user pushed back on an answer, had to repeat a request, hit an error, or was told the assistant could not deliver what they asked. Flagged only when the judgement is confident, so it is a short list worth working rather than every conversation with a caveat), 'good' (the user explicitly said the answer was what they needed), 'ok' (everything else, which is most conversations), 'abandoned' (the user stopped responding to Dot's clarifying question). Populated asynchronously after the chat completes, so it may be null until scoring catches up."},"conversation_score_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversation Score Reason","description":"Why the conversation got its `conversation_score`. For 'problem' this is a written explanation naming what specifically went wrong (the metric, table, error or correction involved) so it can be acted on. For 'good', 'ok' and 'abandoned' it is a fixed sentence restating the verdict, not a per-conversation analysis."},"slack_real_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slack Real Name","description":"Slack display name of the user who asked the question. Only populated when `channel='slack'`."},"slack_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slack Email","description":"Email address from the Slack profile of the asking user. Only populated when `channel='slack'`."},"slack_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slack Title","description":"Job title from the Slack profile of the asking user. Only populated when `channel='slack'`."},"slack_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slack User Id","description":"Slack user ID of the asking user (the workspace-scoped identifier Slack assigns to each member). Only populated when `channel='slack'`."},"workspace_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Name","description":"Human-readable name of the workspace the query came from. Only populated when the export was requested with `include_all_workspaces=true`."},"workspace_org_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Org Id","description":"Org ID of the workspace the query came from (e.g. 'getdot.ai-w-cause'). Only populated when the export was requested with `include_all_workspaces=true`."}},"type":"object","title":"UserQueryRow","description":"One row of the Usage export: one user query turn.\n\nMirrors the `user_queries` table plus a small set of fields enriched at\nread time from `chat_history` (schedules, sharing, labels, parent chat,\nwhat the chat was for).\nField naming intentionally preserves both the raw column name and the\nclearer customer-facing alias for the scheduled flags, because removing\neither would break existing consumers."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"_NoteSaveBody":{"properties":{"title":{"type":"string","title":"Title"},"note":{"type":"string","title":"Note"},"groups":{"items":{"type":"string"},"type":"array","title":"Groups"},"active":{"type":"boolean","title":"Active","default":true},"parent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Id"},"concept_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Concept Id"},"base_blob_sha":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Base Blob Sha"},"base_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Base Active"},"foundational":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Foundational"}},"type":"object","required":["title","note"],"title":"_NoteSaveBody","description":"A note save from the Model page or the CLI. ``parent_id`` counts only when the body sends it."},"_ResetCreditsBody":{"properties":{"cycle_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cycle Start"}},"type":"object","title":"_ResetCreditsBody"},"_SetCreditsBody":{"properties":{"credits_override":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Override"},"credits_cycle_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Cycle Days"},"credits_cycle_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Credits Cycle Start"}},"type":"object","title":"_SetCreditsBody"},"_SetCreditsUsedBody":{"properties":{"credits_used":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Credits Used"},"recompute":{"type":"boolean","title":"Recompute","default":false},"since":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"},"dry_run":{"type":"boolean","title":"Dry Run","default":false},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"force":{"type":"boolean","title":"Force","default":false}},"type":"object","title":"_SetCreditsUsedBody"}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-API-KEY"},"APIKeyCookie":{"type":"apiKey","in":"cookie","name":"Authorization"},"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/api/auth/token"}}},"APIKeyQuery":{"type":"apiKey","in":"query","name":"user_id"},"QueryTokenAuth":{"type":"apiKey","in":"query","name":"user_id+api_token"}}}}