{"openapi":"3.1.0","info":{"title":"Maritime API","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Root","description":"Friendly landing for anyone who opens the API base URL in a browser.\n\nWithout this, FastAPI's default 404 ({\"detail\": \"Not Found\"}) makes the\nwhole API look dead to someone clicking https://api.maritime.sh.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health Check","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/announcement":{"get":{"summary":"Get Active Announcement","description":"Return the currently active announcement banner, if any.","operationId":"get_active_announcement_api_announcement_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/signup":{"post":{"tags":["auth"],"summary":"Signup","description":"Create a new user with email/password.\n\n- Validates password strength\n- Hashes password with bcrypt\n- Creates user in database\n- Returns user data (excludes password hash)","operationId":"signup_api_auth_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/validate-credentials":{"post":{"tags":["auth"],"summary":"Validate Credentials","description":"Validate email/password credentials.\n\nCalled by Auth.js Credentials provider during login.\nRate limited to 5 attempts per minute per IP.\n\nReturns:\n    User data if credentials are valid\n\nRaises:\n    HTTPException 401: Invalid credentials\n    HTTPException 429: Rate limit exceeded","operationId":"validate_credentials_api_auth_validate_credentials_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/cli-signup":{"post":{"tags":["auth"],"summary":"Cli Signup","description":"Sign up via CLI and return a bearer token for subsequent API calls.","operationId":"cli_signup_api_auth_cli_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CliAuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/cli-login":{"post":{"tags":["auth"],"summary":"Cli Login","description":"Log in via CLI and return a bearer token for subsequent API calls.","operationId":"cli_login_api_auth_cli_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CliAuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/cli-token":{"post":{"tags":["auth"],"summary":"Issue Cli Token","description":"Issue a CLI JWT for the authenticated user.\n\nCalled by the frontend /api/auth/cli-token route. The caller must present\na valid session JWT (Authorization: Bearer …); the user identity is taken\nfrom that token, never from the request body, to prevent impersonation.","operationId":"issue_cli_token_api_auth_cli_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Issue Cli Token Api Auth Cli Token Post"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/auth/cli-refresh":{"post":{"tags":["auth"],"summary":"Cli Refresh","description":"Refresh a CLI token. Accepts a valid (non-expired) CLI JWT in the\nAuthorization header, verifies the user still exists, and returns a\nfresh 30-day token.","operationId":"cli_refresh_api_auth_cli_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CliAuthResponse"}}}}}}},"/api/auth/forgot-password":{"post":{"tags":["auth"],"summary":"Forgot Password","description":"Initiate a password reset.\n\nGenerates a single-use token (1 hour expiry), stores its SHA-256 hash,\nand emails a reset link. Always returns ok to prevent email enumeration.\nSkips silently for OAuth-only users.","operationId":"forgot_password_api_auth_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Forgot Password Api Auth Forgot Password Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/reset-password":{"post":{"tags":["auth"],"summary":"Reset Password","description":"Complete a password reset using a valid token.\n\nVerifies the token's SHA-256 hash, expiry, and that it hasn't been used.\nOn success, updates the password and invalidates all of the user's other\noutstanding tokens.","operationId":"reset_password_api_auth_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/verify-email":{"post":{"tags":["auth"],"summary":"Verify Email","description":"Confirm an email-verification token.\n\nVerifies the token's SHA-256 hash and expiry, marks the user's email\nverified (User.emailVerified = now), and consumes all of that email's\noutstanding verification tokens. Idempotent-ish: a re-used/last token for\nan already-verified user still resolves cleanly to the same verified state.","operationId":"verify_email_api_auth_verify_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Verify Email Api Auth Verify Email Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/resend-verification":{"post":{"tags":["auth"],"summary":"Resend Verification","description":"Re-send the email-verification link.\n\nOnly (re)sends for a real, password-based, still-unverified account.\nAlways returns ok to avoid email enumeration. Rate limited per IP.","operationId":"resend_verification_api_auth_resend_verification_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendVerificationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Resend Verification Api Auth Resend Verification Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/welcome-email":{"post":{"tags":["auth"],"summary":"Welcome Email","description":"Trigger the one-time welcome email for a newly registered account.\n\nCalled by the frontend on a first-ever OAuth sign-in (email/password\nsignups get theirs from /verify-email instead). Safe to expose\nunauthenticated: the service only mails an address the user provably\nowns (OAuth Account row or verified email), the welcomeEmailSentAt\nclaim makes it once-ever per account, and every pre-existing account\nwas stamped at migration time. Always returns ok (enumeration-safe).","operationId":"welcome_email_api_auth_welcome_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WelcomeEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Welcome Email Api Auth Welcome Email Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"tags":["plugin-oauth"],"summary":"Authorization Server Metadata","description":"Publishes the OAuth endpoints and supported grant methods.","operationId":"authorization_server_metadata__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}]},"type":"object","title":"Response Authorization Server Metadata  Well Known Oauth Authorization Server Get"}}}}}}},"/api/plugin-oauth/consent":{"post":{"tags":["plugin-oauth"],"summary":"Consent","description":"Issues a single use code after the Maritime user approves access.","operationId":"consent_api_plugin_oauth_consent_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Consent Api Plugin Oauth Consent Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/plugin-oauth/token":{"post":{"tags":["plugin-oauth"],"summary":"Exchange Token","description":"Exchanges a code or refresh token for a scoped access token.","operationId":"exchange_token_api_plugin_oauth_token_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_exchange_token_api_plugin_oauth_token_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/plugin-oauth/revoke":{"post":{"tags":["plugin-oauth"],"summary":"Revoke Token","description":"Revokes a refresh grant and all of its access tokens.","operationId":"revoke_token_api_plugin_oauth_revoke_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_revoke_token_api_plugin_oauth_revoke_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/plugin-oauth/me":{"get":{"tags":["plugin-oauth"],"summary":"Token Identity","description":"Confirms that a presented OAuth access token is valid.","operationId":"token_identity_api_plugin_oauth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Token Identity Api Plugin Oauth Me Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/auth/device/code":{"post":{"tags":["auth"],"summary":"Start Device Login","description":"Issues a device code and user code pair for a terminal with no browser.\n\nNo auth. The device code is returned once and stored only as a digest.","operationId":"start_device_login_api_auth_device_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceCodeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/device/token":{"post":{"tags":["auth"],"summary":"Poll Device Token","description":"Exchanges an approved device code for a CLI token, once.\n\nNo auth: the device code is the secret. Answers 400 with\n``{\"error\": ...}`` while the code is pending (``authorization_pending``),\npolled too fast (``slow_down``), expired, unknown or already used\n(``expired_token``), or denied (``access_denied``).","operationId":"poll_device_token_api_auth_device_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceTokenRequest"}}},"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/device/approve":{"post":{"tags":["auth"],"summary":"Approve Device Login","description":"Approves a pending user code as the signed-in user (session auth, like cli-token).","operationId":"approve_device_login_api_auth_device_approve_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceUserCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceDecisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/auth/device/deny":{"post":{"tags":["auth"],"summary":"Deny Device Login","description":"Denies a pending user code; the polling terminal then gets ``access_denied``.","operationId":"deny_device_login_api_auth_device_deny_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceUserCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceDecisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/analytics/session":{"post":{"tags":["analytics"],"summary":"Track Session Event","operationId":"track_session_event_api_analytics_session_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user-agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionEventRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/ui/{path}":{"post":{"tags":["agent-ui"],"summary":"Proxy Agent Ui","description":"Reverse-proxy requests to the agent's container UI.","operationId":"proxy_agent_ui_api_agents__agent_id__ui__path__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"path","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"}}}}}},"options":{"tags":["agent-ui"],"summary":"Proxy Agent Ui","description":"Reverse-proxy requests to the agent's container UI.","operationId":"proxy_agent_ui_api_agents__agent_id__ui__path__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"path","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"}}}}}},"put":{"tags":["agent-ui"],"summary":"Proxy Agent Ui","description":"Reverse-proxy requests to the agent's container UI.","operationId":"proxy_agent_ui_api_agents__agent_id__ui__path__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"path","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"}}}}}},"delete":{"tags":["agent-ui"],"summary":"Proxy Agent Ui","description":"Reverse-proxy requests to the agent's container UI.","operationId":"proxy_agent_ui_api_agents__agent_id__ui__path__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"path","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"}}}}}},"head":{"tags":["agent-ui"],"summary":"Proxy Agent Ui","description":"Reverse-proxy requests to the agent's container UI.","operationId":"proxy_agent_ui_api_agents__agent_id__ui__path__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"path","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"}}}}}},"patch":{"tags":["agent-ui"],"summary":"Proxy Agent Ui","description":"Reverse-proxy requests to the agent's container UI.","operationId":"proxy_agent_ui_api_agents__agent_id__ui__path__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"path","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"}}}}}},"get":{"tags":["agent-ui"],"summary":"Proxy Agent Ui","description":"Reverse-proxy requests to the agent's container UI.","operationId":"proxy_agent_ui_api_agents__agent_id__ui__path__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"path","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/agents/{agent_id}/ui":{"get":{"tags":["agent-ui"],"summary":"Proxy Agent Ui Root","description":"Proxy the root UI path (no trailing slash).","operationId":"proxy_agent_ui_root_api_agents__agent_id__ui_get","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents":{"get":{"tags":["agents"],"summary":"List Agents","operationId":"list_agents_api_agents_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by exact agent name","title":"Name"},"description":"Filter by exact agent name"},{"name":"externalId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by caller-supplied external id (exact match)","title":"Externalid"},"description":"Filter by caller-supplied external id (exact match)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["agents"],"summary":"Create Agent","operationId":"create_agent_api_agents_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/duplicate":{"post":{"tags":["agents"],"summary":"Duplicate Agent","description":"Stamp N fresh instances from this agent's definition (plan 18 Phase 1).\n\nInstances copy the source's image/framework/env, never its volume,\nmemory, channels, or identity, and group under a shared project\n(created implicitly on the first duplicate). Stamping goes through\nproject_service.spawn_project_instance, the same path the project\nfront door's `spawn` policy uses.","operationId":"duplicate_agent_api_agents__agent_id__duplicate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateAgentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateAgentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/servers/list":{"get":{"tags":["agents"],"summary":"List Servers For Deploy","description":"Return active servers for server selection during deploy.","operationId":"list_servers_for_deploy_api_agents_servers_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/agents/{agent_id}/diagnostic":{"get":{"tags":["agents"],"summary":"Get Agent Diagnostic","description":"Return the current recognized issue for an errored agent, if any.","operationId":"get_agent_diagnostic_api_agents__agent_id__diagnostic_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AgentDiagnosticResponse"},{"type":"null"}],"title":"Response Get Agent Diagnostic Api Agents  Agent Id  Diagnostic Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}":{"get":{"tags":["agents"],"summary":"Get Agent","operationId":"get_agent_api_agents__agent_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["agents"],"summary":"Update Agent","description":"Update agent metadata.\n\n`instructions` (the persona) is routed to the MARITIME_INSTRUCTIONS env\nvar and takes effect at the agent's next restart — the runtime entrypoint\nrewrites the persona block in AGENTS.md when the content changes. \"\" clears\nit; null leaves it unchanged.","operationId":"update_agent_api_agents__agent_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["agents"],"summary":"Delete Agent","description":"Delete an agent. DB-first, fast response.\n\nThe DB row (with its cascades) is the user-visible delete and completes\nin milliseconds; runtime cleanup (containers/VMs/volumes on remote hosts,\nInkbox identity) runs as a background task AFTER the 204 is sent. The old\ninline order (cleanup first, DB last, no timeouts) meant one slow or dead\nhost pushed the response past the frontend/edge timeout: the browser\nshowed an error while the delete eventually succeeded server-side.","operationId":"delete_agent_api_agents__agent_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/skills":{"get":{"tags":["agents"],"summary":"List Agent Skills","description":"Enumerate OpenClaw skills available in this agent's runtime.\n\nWraps `openclaw skills list --json` inside the container/VM and returns\na structured summary so the dashboard can render an at-a-glance view of\nwhat's eligible, what's blocked on which binary/env, and what's\nunsupported on the agent's OS.\n\nResponse shape:\n  {\n    \"agent_id\": str,\n    \"framework\": str,\n    \"summary\": {\"eligible\": int, \"blocked\": int, \"unsupported\": int},\n    \"eligible\":    [{name, description, emoji, source, homepage}],\n    \"blocked\":     [{name, description, emoji, missing: {bins, env}}],\n    \"unsupported\": [{name, description, emoji, missing: {os}}],\n  }\n\nOpenclaw- and hermes-family agents are supported (the others don't\nhave a skill registry). Sleeping serverless agents are woken.","operationId":"list_agent_skills_api_agents__agent_id__skills_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/skills/allowlist":{"put":{"tags":["agents"],"summary":"Set Agent Skills Allowlist","description":"Set the per-agent skill toggle state inside the running container.\n\nOpenclaw: writes agents.list[id=main].skills (a whitelist) into\nopenclaw.json; takes effect on the next `skills list` enumeration.\nHermes: translates the enabled-allowlist into hermes's native\n`skills.disabled` blacklist in ~/.hermes/config.yaml (disabled =\ninstalled minus allowlist; null allowlist clears it). Hermes reads\nthe config fresh on each skill lookup, so no restart either way.","operationId":"set_agent_skills_allowlist_api_agents__agent_id__skills_allowlist_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillAllowlistBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/skills/env":{"put":{"tags":["agents"],"summary":"Set Agent Skills Env","description":"Upsert env vars for skills that gate on them (NOTION_API_KEY,\nGOOGLE_PLACES_API_KEY, …) and trigger a container restart so the\nagent's gateway picks them up.","operationId":"set_agent_skills_env_api_agents__agent_id__skills_env_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillEnvBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/skills/search":{"get":{"tags":["agents"],"summary":"Search Clawhub Skills","description":"Search the framework's community registry server-side: ClawHub\n(clawhub.ai) for openclaw-family agents, skills.sh for hermes-family.\n\nWhy direct-to-registry instead of the in-container CLI search: the\nregistries are public, so going through the agent just adds a\nruntime command round trip per query (and hermes's CLI\nhas no JSON output at all). The agent ownership check is still done\nto authorize the caller.\n\nResponse: `{results: [{slug, displayName, summary, score, owner: {...},\nupdatedAt, stats: {stars, downloads, ...} | null}]}`. For ClawHub,\n`slug` is the namespaced install ref (`owner/name`) — pass it verbatim\nto the install endpoint.","operationId":"search_clawhub_skills_api_agents__agent_id__skills_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"ClawHub search query (empty returns nothing)","default":"","title":"Q"},"description":"ClawHub search query (empty returns nothing)"},{"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/skills/install":{"post":{"tags":["agents"],"summary":"Install Clawhub Skill","description":"Install a skill from ClawHub (`slug`) or a git repo (`git`), then run\nthe just-works pipeline: apply any provided `env`, auto-resolve missing\nbinaries inside the agent's VM (nix catalog -> npm -> pip3 -> apt-get,\nrecorded in the /data manifest for boot replay), and report the final\nstate.\n\nResponse: `{ok, slug|git, output, status, missing?, resolved?, reason?}`\nwhere status is `active` (usable now), `needs_input` (missing.env /\nmissing.config need values; pass them to PUT /skills/env or re-call with\n`env`), or `failed`. The legacy fields (ok/slug/output) are unchanged for\nexisting dashboard callers.","operationId":"install_clawhub_skill_api_agents__agent_id__skills_install_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillInstallBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/skills/upload":{"post":{"tags":["agents"],"summary":"Upload Custom Skill","description":"Install a CUSTOM skill from an uploaded archive, then run the same\njust-works pipeline as /skills/install (env apply, binary auto-resolve,\nfinal-state report). The reseller path: an end-user drags a skill folder\ninto the partner's UI and it lands running on their agent.","operationId":"upload_custom_skill_api_agents__agent_id__skills_upload_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillUploadBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/skills/{skill_name}":{"delete":{"tags":["agents"],"summary":"Remove Agent Skill","description":"Remove an installed skill (workspace or managed dir) and drop its\nlines from the dependency manifest. Built-in image skills can't be\nremoved this way (they don't live under /data), only disabled via the\nallowlist.","operationId":"remove_agent_skill_api_agents__agent_id__skills__skill_name__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"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/agents/{agent_id}/skills/{skill_name}/export":{"get":{"tags":["agents"],"summary":"Export Agent Skill","description":"Download an installed skill as a .tar.gz: the other half of\nupload. Lets an end-user take their custom skill (or a tweaked copy of\na hub skill) to another agent or share it.","operationId":"export_agent_skill_api_agents__agent_id__skills__skill_name__export_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"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/agents/{agent_id}/resize":{"post":{"tags":["agents"],"summary":"Resize Agent","description":"Change an agent's RAM / SSD allocation or always-on state.\n\nRAM and disk apply on the agent's next restart (snapshots pin the old\nmemory size; no live resize). Always-on applies immediately: the idle\nmonitor reads idle_ttl_seconds from the DB each sweep.\n\nSeats accounts (plan 27 v2): paid plans may resize freely, add-ons\naccrue per day from tonight's accrual; the free tier cannot exceed the\nbase allocation. Wallet (grandfathered) accounts resize freely and are\nnever billed for it.","operationId":"resize_agent_api_agents__agent_id__resize_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResizeBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/start":{"post":{"tags":["agents"],"summary":"Start Agent","operationId":"start_agent_api_agents__agent_id__start_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/stop":{"post":{"tags":["agents"],"summary":"Stop Agent","operationId":"stop_agent_api_agents__agent_id__stop_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/restart":{"post":{"tags":["agents"],"summary":"Restart Agent","description":"Returns the Agent after the configured restart operation completes.","operationId":"restart_agent_api_agents__agent_id__restart_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/reset-to-upstream":{"post":{"tags":["agents"],"summary":"Reset To Upstream","description":"Discard the agent's derived image and rebuild from the upstream\nbase image. Use this to pick up new openclaw releases, recover from\na bad in-container edit, or audit that the agent is running clean\nupstream code. Customizations (shell edits, npm installs,\nscripts in /tmp) are lost. Anything in /data persists.","operationId":"reset_to_upstream_api_agents__agent_id__reset_to_upstream_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/reload-env":{"post":{"tags":["agents"],"summary":"Reload Env","description":"Hot-reload env vars into a running container. Falls back to rebuilding with saved configuration.","operationId":"reload_env_api_agents__agent_id__reload_env_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/sleep":{"post":{"tags":["agents"],"summary":"Sleep Agent","operationId":"sleep_agent_api_agents__agent_id__sleep_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/account/delete":{"delete":{"tags":["agents"],"summary":"Delete Account","description":"Permanently and fully delete the user's account.\n\nDeletes every agent row, cancels any Stripe subscription, removes all\nuser-owned records (wallet ledger + enterprise account, API keys,\nprojects, LLM usage, Stripe billing links, webhook subs,\nsessions, notifications, usage/trace events), and deletes the NextAuth\nlogin identity (User/Account/Session) so the account is truly gone, not\njust its agents. Runtime teardown (containers/VMs/volumes/networks, plus\nthe Inkbox identity for identity-framework agents) runs as background\ntasks after the response, via the same cleanup path single-agent deletes\nuse. A confirmation email goes to the (pre-captured) address once the\nlogin identity is verified gone.\n\nEvery step runs in its own SAVEPOINT. Postgres aborts the *entire*\ntransaction on any failed statement, so the previous version (which issued\n`DELETE FROM customers …` against a table that doesn't exist on this\ndeployment) poisoned the transaction and silently rolled back the whole\ndeletion (including the agents), then 500'd. Savepoints isolate each step so\none failure can't undo the rest.","operationId":"delete_account_api_agents_account_delete_delete","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AccountDeleteRequest"},{"type":"null"}],"title":"Payload"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/plans/launch-promo":{"get":{"tags":["plans"],"summary":"Launch Promo Status","description":"Public: whether the launch credit ($100 of AI credits for the first\npaid plans) is still open and how many spots remain. Drives the\nbanner on /signup and /billing; carries no account data.","operationId":"launch_promo_status_api_plans_launch_promo_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/plans":{"get":{"tags":["plans"],"summary":"Get Plans","description":"The catalog plus this account's plan state. Wallet (grandfathered)\naccounts see `billingModel: wallet` and no catalog; their pricing is\nunchanged forever.","operationId":"get_plans_api_plans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/plans/subscribe":{"post":{"tags":["plans"],"summary":"Subscribe","description":"Start a plan (returns a Stripe Checkout URL that collects the card),\nor switch/resume in place when a live subscription exists. A lapsed\naccount that subscribes again goes through Checkout and reactivates on\nthe completed webhook; its slept agents wake on next use.","operationId":"subscribe_api_plans_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/plans/cancel":{"post":{"tags":["plans"],"summary":"Cancel","description":"Cancel at period end (Stripe cancel_at_period_end). Entitlement runs\nuntil the cycle closes; the final invoice settles the last add-on usage.\nThe optional reason/comment from the cancel questionnaire lands in\ncontact_messages for founder review.","operationId":"cancel_api_plans_cancel_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CancelBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/plans/portal":{"post":{"tags":["plans"],"summary":"Portal","description":"Stripe Customer Portal session: update the card, browse invoices.","operationId":"portal_api_plans_portal_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PortalBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/projects":{"get":{"tags":["projects"],"summary":"List Projects","description":"The user's projects with rollups: the primary list surface. One row\nper project: agent counts by status, instance count, customer count,\nfreshest activity.","operationId":"list_projects_api_projects_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/projects/{project_id}":{"get":{"tags":["projects"],"summary":"Get Project","operationId":"get_project_api_projects__project_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["projects"],"summary":"Update Project","operationId":"update_project_api_projects__project_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/channels/telegram":{"post":{"tags":["projects"],"summary":"Connect Telegram","description":"Point a Telegram bot at this project: validate via getMe, register the\nwebhook, upsert the channel row. The bot becomes the project's front\ndoor: end users DM it, the platform routes each chat to its instance.","operationId":"connect_telegram_api_projects__project_id__channels_telegram_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectTelegramRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectChannelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["projects"],"summary":"Disconnect Telegram","operationId":"disconnect_telegram_api_projects__project_id__channels_telegram_delete","security":[{"HTTPBearer":[]}],"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/projects/{project_id}/bindings":{"get":{"tags":["projects"],"summary":"List Bindings","operationId":"list_bindings_api_projects__project_id__bindings_get","security":[{"HTTPBearer":[]}],"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/projects/{project_id}/bindings/{binding_id}/reassign":{"post":{"tags":["projects"],"summary":"Reassign Binding","operationId":"reassign_binding_api_projects__project_id__bindings__binding_id__reassign_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"binding_id","in":"path","required":true,"schema":{"type":"string","title":"Binding Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReassignBindingRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/bindings/{binding_id}":{"delete":{"tags":["projects"],"summary":"Unbind","operationId":"unbind_api_projects__project_id__bindings__binding_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"binding_id","in":"path","required":true,"schema":{"type":"string","title":"Binding Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/claim-codes":{"get":{"tags":["projects"],"summary":"List Claim Codes","operationId":"list_claim_codes_api_projects__project_id__claim_codes_get","security":[{"HTTPBearer":[]}],"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"}}}}}},"post":{"tags":["projects"],"summary":"Create Claim Codes","operationId":"create_claim_codes_api_projects__project_id__claim_codes_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateClaimCodesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/projects/{project_id}/usage":{"get":{"tags":["projects"],"summary":"Project Usage","description":"Per-customer usage rollup (plan 18 follow-up): what each binding cost\nover the last 30 days, so a dev can re-bill THEIR customers.\n\nAttribution: an instance's 30d compute + LLM spend is split across its\nbindings weighted by message_count (equal split when all zero). For\nspawn-per-customer projects this is exact (one binding per instance);\nfor single/assign it's a fair proxy.","operationId":"project_usage_api_projects__project_id__usage_get","security":[{"HTTPBearer":[]}],"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/projects/{project_id}/sync-instances":{"post":{"tags":["projects"],"summary":"Sync Instances","description":"Phase 4 (definition updates, v1): push the source agent's env to every\ninstance and reload it. Active instances hot-reload (or restart); sleeping\ninstances pick the new env up at their next cold boot, since the platform's\nstanding env semantics.","operationId":"sync_instances_api_projects__project_id__sync_instances_post","security":[{"HTTPBearer":[]}],"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/v1/projects/{project_id}/messages":{"post":{"tags":["front-door"],"summary":"Send Message","operationId":"send_message_api_v1_projects__project_id__messages_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageSend"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/messages/{message_id}":{"get":{"tags":["front-door"],"summary":"Get Message","operationId":"get_message_api_v1_projects__project_id__messages__message_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"message_id","in":"path","required":true,"schema":{"type":"string","title":"Message Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageState"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/users":{"get":{"tags":["front-door"],"summary":"List Users","description":"The project's end-user list: every identity bound via the HTTP front door.","operationId":"list_users_api_v1_projects__project_id__users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FrontDoorUser"},"title":"Response List Users Api V1 Projects  Project Id  Users Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{project_id}/users/{external_user_id}":{"get":{"tags":["front-door"],"summary":"Get User","operationId":"get_user_api_v1_projects__project_id__users__external_user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"external_user_id","in":"path","required":true,"schema":{"type":"string","title":"External User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrontDoorUser"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["front-door"],"summary":"Unbind User","description":"Unbind an end-user. The instance stays and, being unbound, rejoins the\nproject's warm pool. Destroying the VM is a separate, explicit call.","operationId":"unbind_user_api_v1_projects__project_id__users__external_user_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"project_id","in":"path","required":true,"schema":{"type":"string","title":"Project Id"}},{"name":"external_user_id","in":"path","required":true,"schema":{"type":"string","title":"External User Id"}},{"name":"delete_agent","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Delete Agent"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/usage":{"get":{"tags":["usage"],"summary":"Usage Report","operationId":"usage_report_api_v1_usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO start (default: to - 30d)","title":"From"},"description":"ISO start (default: to - 30d)"},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO end (default: now)","title":"To"},"description":"ISO end (default: now)"},{"name":"projectId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Projectid"}},{"name":"externalUserId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Externaluserid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/usage/daily":{"get":{"tags":["usage"],"summary":"Usage By Day","description":"The account's cost by day: hosting (allocated under a seat plan, else debits), LLM, minutes.","operationId":"usage_by_day_api_v1_usage_daily_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO start (default: to - 30d)","title":"From"},"description":"ISO start (default: to - 30d)"},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO end (default: now)","title":"To"},"description":"ISO end (default: now)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DailyUsageReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feedback":{"get":{"tags":["feedback"],"summary":"List Feedback","description":"Lists the calling account's most recent reports, newest first.","operationId":"list_feedback_api_v1_feedback_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/FeedbackResponse"},"type":"array","title":"Response List Feedback Api V1 Feedback Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["feedback"],"summary":"Submit Feedback","description":"Records one feedback report for the calling account and emails the founders.\n\nReturns 202 with the stored report. 404 when `agentId` is not the caller's\nagent, 429 past the per-minute or 24-hour cap.","operationId":"submit_feedback_api_v1_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackCreate"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/end-users/{external_id}":{"put":{"tags":["end-users"],"summary":"Upsert End User","description":"Creates the end user, or updates the fields sent. 201 on create, 200 after.","operationId":"upsert_end_user_api_v1_end_users__external_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUserUpsert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["end-users"],"summary":"Get End User","description":"Returns one end user with its agents and access rollups.","operationId":"get_end_user_api_v1_end_users__external_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUserDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["end-users"],"summary":"Delete End User","description":"Deletes the end user and every agent it owns, with their data.\n\nThe rows go now; VMs, volumes and images are removed after the response.","operationId":"delete_end_user_api_v1_end_users__external_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/end-users":{"get":{"tags":["end-users"],"summary":"List End Users","description":"Lists the account's end users one page at a time, newest first unless sorted by activity.","operationId":"list_end_users_api_v1_end_users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag"}},{"name":"externalIdPrefix","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Externalidprefix"}},{"name":"lastActiveBefore","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastactivebefore"}},{"name":"lastActiveAfter","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastactiveafter"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Matches an external id prefix or a display name","title":"Q"},"description":"Matches an external id prefix or a display name"},{"name":"projectId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only users of this agent group","title":"Projectid"},"description":"Only users of this agent group"},{"name":"agentId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only the user that owns this agent","title":"Agentid"},"description":"Only the user that owns this agent"},{"name":"sort","in":"query","required":false,"schema":{"type":"string","description":"created or lastActive","default":"created","title":"Sort"},"description":"created or lastActive"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUserList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/end-users/{external_id}/activity":{"get":{"tags":["end-users"],"summary":"Get End User Activity","description":"Returns the end user's recent activity, newest first: messages, wakes, sleeps, agent creates.","operationId":"get_end_user_activity_api_v1_end_users__external_id__activity_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":40,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUserActivity"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/end-users/{external_id}/agents":{"get":{"tags":["end-users"],"summary":"List End User Agents","description":"Returns the end user's agents in the full agent shape.","operationId":"list_end_user_agents_api_v1_end_users__external_id__agents_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AgentResponse"},"title":"Response List End User Agents Api V1 End Users  External Id  Agents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["end-users"],"summary":"Create End User Agent","description":"Creates the end user's agent, exactly once.\n\nUpserts the end user, then: when it already has an agent, returns that\nagent with 200 and creates nothing; otherwise creates the agent through\nthe core create path (same gates, same deploy), links it to the end user,\napplies the policy, and answers 201. Safe to call on every sign-in.","operationId":"create_end_user_agent_api_v1_end_users__external_id__agents_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUserAgentCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/end-users/{external_id}/tokens":{"post":{"tags":["end-users"],"summary":"Mint End User Token","description":"Mints a short-lived token the end user's own client uses to reach one of its agents.\n\nDefaults: the end user's oldest agent, scope ``chat``, 900 seconds. Scopes:\nchat, files, console, logs, app. The token is shown once. A suspended end\nuser's tokens stop working at once.","operationId":"mint_end_user_token_api_v1_end_users__external_id__tokens_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUserTokenRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUserTokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["end-users"],"summary":"Revoke End User Tokens","description":"Revokes every live token of the end user.","operationId":"revoke_end_user_tokens_api_v1_end_users__external_id__tokens_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/end-users/{external_id}/policy":{"get":{"tags":["end-users"],"summary":"Get End User Policy","description":"Returns the end user's policy, or null when none is set.","operationId":"get_end_user_policy_api_v1_end_users__external_id__policy_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUserPolicyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["end-users"],"summary":"Put End User Policy","description":"Replaces the end user's policy and applies it to every agent it owns now.\n\nFields: llm_spend_cap_cents_per_month, compute_minutes_cap, wakes_per_hour,\nidle_sleep_seconds, mem_mb, vcpus, disk_gb. A field left out is not set.","operationId":"put_end_user_policy_api_v1_end_users__external_id__policy_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUserPolicyBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUserPolicyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["end-users"],"summary":"Delete End User Policy","description":"Removes the policy. The LLM cap on the agents is cleared; core fields stay.","operationId":"delete_end_user_policy_api_v1_end_users__external_id__policy_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUserPolicyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/end-users/{external_id}/suspend":{"post":{"tags":["end-users"],"summary":"Suspend End User","description":"Suspends the end user: its agents go to sleep and refuse wakes and LLM calls. Data is kept.","operationId":"suspend_end_user_api_v1_end_users__external_id__suspend_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/end-users/{external_id}/resume":{"post":{"tags":["end-users"],"summary":"Resume End User","description":"Makes a suspended end user active again. Agents wake on the next message.","operationId":"resume_end_user_api_v1_end_users__external_id__resume_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"external_id","in":"path","required":true,"schema":{"type":"string","title":"External Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/end-user-summary":{"get":{"tags":["end-users"],"summary":"Get End User Summary","description":"Returns the account's users now and per UTC day: total, new, active, and messages.","operationId":"get_end_user_summary_api_v1_end_user_summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndUserSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/fleet/summary":{"get":{"tags":["fleet"],"summary":"Fleet Summary","description":"Health + usage rollup for the signed-in user's fleet (Business dashboard).","operationId":"fleet_summary_api_fleet_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Fleet Summary Api Fleet Summary Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/fleet/overview":{"get":{"tags":["fleet"],"summary":"Fleet Overview","description":"Summary + the full agent list in one call. Polled by the Fleet console.\n\nstorage_bytes is metered hourly for ACTIVE agents only, so 0 means \"not\nmeasured yet\", not \"empty\". The frontend renders it as a dash.","operationId":"fleet_overview_api_fleet_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Fleet Overview Api Fleet Overview Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/fleet/batch":{"post":{"tags":["fleet"],"summary":"Fleet Batch Create","description":"Spin up N identical agents named {prefix}-1..N.\n\nThin loop over the single-agent create route so every agent gets the full\nstandard treatment (gateway password, LLM proxy token, template image,\ninstructions → AGENTS.md, auto-deploy). Guards: ≤50 per request, wallet\nmust hold $1 per requested agent up front.","operationId":"fleet_batch_create_api_fleet_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FleetBatchRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/fleet/propagate":{"post":{"tags":["fleet"],"summary":"Fleet Propagate","description":"Write one file into many of the caller's agents; optionally restart them.\n\nReuses the single-agent file-write route per target, so the /data scope\nguard, ownership check, wake-on-write, and size cap all apply unchanged.\nRestarts are queued to a background task (a container restart takes\nseconds each, and 50 of them can't run inside one request).","operationId":"fleet_propagate_api_fleet_propagate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FleetPropagateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/deploy":{"get":{"tags":["deploy"],"summary":"List Deployments","description":"List all deployments for the current user's agents.","operationId":"list_deployments_api_deploy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/DeploymentListResponse"},"type":"array","title":"Response List Deployments Api Deploy Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["deploy"],"summary":"Create Deployment","description":"Queues a deployment after checking agent and uploaded-archive ownership.","operationId":"create_deployment_api_deploy_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeployCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/deploy/agent/{agent_id}":{"get":{"tags":["deploy"],"summary":"List Agent Deployments","description":"List deployments for a specific agent, including build logs.","operationId":"list_agent_deployments_api_deploy_agent__agent_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DeploymentResponse"},"title":"Response List Agent Deployments Api Deploy Agent  Agent Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/deploy/{deployment_id}":{"get":{"tags":["deploy"],"summary":"Get Deployment","operationId":"get_deployment_api_deploy__deployment_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/deploy/{deployment_id}/cancel":{"post":{"tags":["deploy"],"summary":"Cancel Deployment","description":"Persist cancellation intent for the worker instead of cancelling a request task.","operationId":"cancel_deployment_api_deploy__deployment_id__cancel_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/logs":{"get":{"tags":["logs"],"summary":"Get User Logs","description":"Return log entries across all agents owned by the current user.","operationId":"get_user_logs_api_logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Level"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only entries strictly older than this ISO timestamp (pagination cursor).","title":"Before"},"description":"Only entries strictly older than this ISO timestamp (pagination cursor)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LogEntryResponse"},"title":"Response Get User Logs Api Logs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/logs":{"get":{"tags":["logs"],"summary":"Get Logs","operationId":"get_logs_api_agents__agent_id__logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"default":100,"title":"Limit"}},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Level"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only entries strictly older than this ISO timestamp (pagination cursor).","title":"Before"},"description":"Only entries strictly older than this ISO timestamp (pagination cursor)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LogEntryResponse"},"title":"Response Get Logs Api Agents  Agent Id  Logs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/stats":{"get":{"tags":["stats"],"summary":"Get Stats","operationId":"get_stats_api_agents__agent_id__stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/desktop/mode":{"get":{"tags":["desktop"],"summary":"Desktop Mode","operationId":"desktop_mode_api_agents__agent_id__desktop_mode_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/desktop/takeover":{"post":{"tags":["desktop"],"summary":"Desktop Takeover","operationId":"desktop_takeover_api_agents__agent_id__desktop_takeover_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TakeoverRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/desktop-config":{"patch":{"tags":["desktop"],"summary":"Desktop Config","description":"Turn the screen capability on/off for an existing agent (owner only).\n\nEnabling re-runs the per-plan desktop cap for seats accounts (402 with\ncode=seat_limit, same shape as create). The flag only changes what the\nNEXT boot does: MARITIME_DESKTOP=1 lands in the injected env, maritime-init\nlaunches the desktop stack, and fc-manager's rebase-on-wake cold-boots a\nsnapshot that lacks the desktop drive (plan 33 B).\n\nThere is no persisted \"recreate on next wake\" marker in the wake path —\nwake only recreates when a snapshot is genuinely unusable (plan 30 A1),\nand image/env changes take effect on the next reconstruction. So this applies\nthe change exactly the way env-var edits do (routers/agents.py skill\nenv): an ACTIVE agent is rebuilt through orchestrator.rebuild_agent\n(stop -> commit derived rootfs -> recreate with fresh env); a sleeping or\nstopped agent keeps its snapshot and the change lands on its next\nreconstruction, surfaced through the legacy requiresRestart field.\nRetained public restart does not apply this deferred configuration. Enabling also\nraises the agent's RAM/CPU floor to the desktop default (4 GiB / 2 vCPU)\nwhen it is below — a 2 GB VM runs the screen with ~300 MB free, which is\none Chromium tab away from OOM. Larger allocations are left alone;\ndisabling never shrinks (use the resize endpoint).","operationId":"desktop_config_api_agents__agent_id__desktop_config_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DesktopConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/env":{"get":{"tags":["environment"],"summary":"List Env Vars","operationId":"list_env_vars_api_agents__agent_id__env_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EnvVarResponse"},"title":"Response List Env Vars Api Agents  Agent Id  Env Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["environment"],"summary":"Create Env Var","operationId":"create_env_var_api_agents__agent_id__env_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvVarCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvVarResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/env/{key}":{"put":{"tags":["environment"],"summary":"Update Env Var","operationId":"update_env_var_api_agents__agent_id__env__key__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvVarResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["environment"],"summary":"Delete Env Var","operationId":"delete_env_var_api_agents__agent_id__env__key__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/llm-status":{"get":{"tags":["environment"],"summary":"Get Llm Status","description":"Check whether the agent is using the Maritime LLM proxy or a custom key.\n\nOpenClaw resolves the API key with env > openclaw.json precedence, so we\ncheck both: the live process environment first (highest priority), then\nthe openclaw.json config, then the DB env var as a last resort.","operationId":"get_llm_status_api_agents__agent_id__llm_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/reset-llm":{"post":{"tags":["environment"],"summary":"Reset To Maritime Llm","description":"Replace the agent's OpenAI key with a Maritime proxy token and set the base URL.\n\nUpdates both the env vars in the DB and the openclaw.json inside the\nrunning container so currently deployed agents pick up the change\nwithout a full redeploy.","operationId":"reset_to_maritime_llm_api_agents__agent_id__reset_llm_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/triggers":{"get":{"tags":["triggers"],"summary":"List Triggers","operationId":"list_triggers_api_agents__agent_id__triggers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TriggerResponse"},"title":"Response List Triggers Api Agents  Agent Id  Triggers Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["triggers"],"summary":"Create Trigger","operationId":"create_trigger_api_agents__agent_id__triggers_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/triggers/{trigger_id}":{"put":{"tags":["triggers"],"summary":"Update Trigger","operationId":"update_trigger_api_agents__agent_id__triggers__trigger_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"trigger_id","in":"path","required":true,"schema":{"type":"string","title":"Trigger Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["triggers"],"summary":"Delete Trigger","operationId":"delete_trigger_api_agents__agent_id__triggers__trigger_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"trigger_id","in":"path","required":true,"schema":{"type":"string","title":"Trigger Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/{agent_id}":{"post":{"tags":["webhooks"],"summary":"Receive Webhook","description":"Accept a payload for an agent and deliver it in the background.\n\nReturns the agent record under auth modes ``off``/``warn`` (legacy shape;\n``status`` reflects the agent's state at accept time, the wake itself\nhappens in the background) and ``{\"status\": \"accepted\"}`` under\n``require``.","operationId":"receive_webhook_api_webhooks__agent_id__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/{agent_id}/token":{"get":{"tags":["webhooks"],"summary":"Get Webhook Token","description":"Return the invoke token for an agent you own, plus a ready-to-use URL.\n\nThe token is the agent's internal HMAC token (the value its VM already\nholds as MARITIME_INTERNAL_TOKEN); it is derived, so nothing is stored\nand it stays valid for the agent's lifetime.","operationId":"get_webhook_token_api_webhooks__agent_id__token_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/{agent_id}/token/rotate":{"post":{"tags":["webhooks"],"summary":"Rotate Webhook Token","description":"Replaces the agent's invoke token with a new stored secret.\n\nThe previous token stops opening the invoke URL at once. The derived\ninternal token the VM holds is not affected. Update every caller that\nholds the URL (for example a partner's delivery target) with the new one.","operationId":"rotate_webhook_token_api_webhooks__agent_id__token_rotate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks":{"get":{"tags":["webhooks"],"summary":"List Webhooks","operationId":"list_webhooks_api_v1_webhooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/WebhookResponse"},"type":"array","title":"Response List Webhooks Api V1 Webhooks Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["webhooks"],"summary":"Create Webhook","operationId":"create_webhook_api_v1_webhooks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/webhooks/{sub_id}":{"patch":{"tags":["webhooks"],"summary":"Update Webhook","operationId":"update_webhook_api_v1_webhooks__sub_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string","title":"Sub Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["webhooks"],"summary":"Delete Webhook","operationId":"delete_webhook_api_v1_webhooks__sub_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string","title":"Sub Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/{sub_id}/deliveries":{"get":{"tags":["webhooks"],"summary":"List Deliveries","description":"The delivery log of one subscription, newest first. ``status``: pending, delivered, failed, dead.","operationId":"list_deliveries_api_v1_webhooks__sub_id__deliveries_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string","title":"Sub Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDeliveryResponse"},"title":"Response List Deliveries Api V1 Webhooks  Sub Id  Deliveries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/deliveries/{delivery_id}/replay":{"post":{"tags":["webhooks"],"summary":"Replay Delivery","description":"Sends one delivery again now, whatever its state, and returns the result.","operationId":"replay_delivery_api_v1_webhooks_deliveries__delivery_id__replay_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"delivery_id","in":"path","required":true,"schema":{"type":"string","title":"Delivery Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDeliveryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/{sub_id}/test":{"post":{"tags":["webhooks"],"summary":"Test Webhook","description":"Deliver a synthetic `ping` event to the subscription and return the result.","operationId":"test_webhook_api_v1_webhooks__sub_id__test_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string","title":"Sub Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/inbound-email/resend":{"post":{"tags":["inbound-email"],"summary":"Resend Inbound","operationId":"resend_inbound_api_inbound_email_resend_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/config":{"get":{"tags":["billing"],"summary":"Get Billing Config","description":"Live pricing config (plan 20). The frontend keeps the legacy UI when\nv2_enabled is False and switches to wallet-first pricing when True.","operationId":"get_billing_config_api_billing_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingConfigResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/billing":{"get":{"tags":["billing"],"summary":"Get Billing Summary","operationId":"get_billing_summary_api_billing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingInfoResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/billing/agents":{"get":{"tags":["billing"],"summary":"Get Agent Billing","operationId":"get_agent_billing_api_billing_agents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AgentBillingResponse"},"type":"array","title":"Response Get Agent Billing Api Billing Agents Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/billing/usage":{"get":{"tags":["billing"],"summary":"Get Usage","description":"Get raw usage data for the current billing period.","operationId":"get_usage_api_billing_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/notifications":{"get":{"tags":["notifications"],"summary":"List Notifications","operationId":"list_notifications_api_notifications_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/notifications/unread-count":{"get":{"tags":["notifications"],"summary":"Unread Count","operationId":"unread_count_api_notifications_unread_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/notifications/read-all":{"post":{"tags":["notifications"],"summary":"Read All","operationId":"read_all_api_notifications_read_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/notifications/{notification_id}/read":{"put":{"tags":["notifications"],"summary":"Mark Read","operationId":"mark_read_api_notifications__notification_id__read_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"string","title":"Notification Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/preferences":{"get":{"tags":["preferences"],"summary":"Get Preferences","operationId":"get_preferences_api_me_preferences_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Preferences"}}}}},"security":[{"HTTPBearer":[]}]},"patch":{"tags":["preferences"],"summary":"Update Preferences","operationId":"update_preferences_api_me_preferences_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreferencesUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Preferences"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/email/unsubscribe":{"get":{"tags":["email"],"summary":"Unsubscribe Page","operationId":"unsubscribe_page_api_email_unsubscribe_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}},{"name":"action","in":"query","required":false,"schema":{"type":"string","default":"unsubscribe","title":"Action"}}],"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":["email"],"summary":"Unsubscribe One Click","description":"RFC 8058 one-click target; the client POSTs the List-Unsubscribe\nURL with no user-visible page, so reply in plain text.","operationId":"unsubscribe_one_click_api_email_unsubscribe_post","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/chat":{"post":{"tags":["chat"],"summary":"Chat With Agent","operationId":"chat_with_agent_api_agents__agent_id__chat_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/share/{agent_id}":{"get":{"tags":["public-chat"],"summary":"Public Meta","operationId":"public_meta_api_share__agent_id__get","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicAgentMeta"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/share/{agent_id}/chat":{"post":{"tags":["public-chat"],"summary":"Public Chat","operationId":"public_chat_api_share__agent_id__chat_post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/a/{agent_id}/{path}":{"post":{"tags":["public-web"],"summary":"Public Web Proxy","operationId":"public_web_proxy_a__agent_id___path__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"path","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"}}}}}},"options":{"tags":["public-web"],"summary":"Public Web Proxy","operationId":"public_web_proxy_a__agent_id___path__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"path","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"}}}}}},"put":{"tags":["public-web"],"summary":"Public Web Proxy","operationId":"public_web_proxy_a__agent_id___path__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"path","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"}}}}}},"delete":{"tags":["public-web"],"summary":"Public Web Proxy","operationId":"public_web_proxy_a__agent_id___path__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"path","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"}}}}}},"head":{"tags":["public-web"],"summary":"Public Web Proxy","operationId":"public_web_proxy_a__agent_id___path__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"path","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"}}}}}},"patch":{"tags":["public-web"],"summary":"Public Web Proxy","operationId":"public_web_proxy_a__agent_id___path__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"path","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"}}}}}},"get":{"tags":["public-web"],"summary":"Public Web Proxy","operationId":"public_web_proxy_a__agent_id___path__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"path","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"}}}}}}},"/a/{agent_id}":{"post":{"tags":["public-web"],"summary":"Public Web Proxy","operationId":"public_web_proxy_a__agent_id__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"query","required":false,"schema":{"type":"string","default":"","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"options":{"tags":["public-web"],"summary":"Public Web Proxy","operationId":"public_web_proxy_a__agent_id__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"query","required":false,"schema":{"type":"string","default":"","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["public-web"],"summary":"Public Web Proxy","operationId":"public_web_proxy_a__agent_id__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"query","required":false,"schema":{"type":"string","default":"","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["public-web"],"summary":"Public Web Proxy","operationId":"public_web_proxy_a__agent_id__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"query","required":false,"schema":{"type":"string","default":"","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"head":{"tags":["public-web"],"summary":"Public Web Proxy","operationId":"public_web_proxy_a__agent_id__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"query","required":false,"schema":{"type":"string","default":"","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["public-web"],"summary":"Public Web Proxy","operationId":"public_web_proxy_a__agent_id__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"query","required":false,"schema":{"type":"string","default":"","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["public-web"],"summary":"Public Web Proxy","operationId":"public_web_proxy_a__agent_id__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"query","required":false,"schema":{"type":"string","default":"","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/contact":{"post":{"tags":["contact"],"summary":"Submit Contact","operationId":"submit_contact_api_contact_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tg/webhook/{route}":{"post":{"tags":["telegram-webhook"],"summary":"Telegram Webhook","operationId":"telegram_webhook_api_tg_webhook__route__post","parameters":[{"name":"route","in":"path","required":true,"schema":{"type":"string","title":"Route"}},{"name":"x-telegram-bot-api-secret-token","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Telegram-Bot-Api-Secret-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/files/download":{"get":{"tags":["files"],"summary":"Download Agent File","description":"Stream a file out of the agent's running container.\n\nThe agent advertises files by emitting a ```maritime-file``` fenced\nblock in its chat output; the dashboard renders that as a download\nbutton which calls this endpoint with the `path` it saw.","operationId":"download_agent_file_api_agents__agent_id__files_download_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"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/agents/{agent_id}/files/list":{"get":{"tags":["files"],"summary":"List Agent Files","description":"List a directory inside the agent's container (file browser).\n\nScoped to the agent's persistent volume (framework-dependent mount:\n/data, /zeroclaw-data, or /opt/data) so the browser can't wander the\nrest of the container filesystem. `path` defaults to the volume root;\nthe response reports that root so clients don't need to hardcode it.\nReturns each entry's type, size and mtime.","operationId":"list_agent_files_api_agents__agent_id__files_list_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/files/mkdir":{"post":{"tags":["files"],"summary":"Mkdir Agent","description":"Create a directory (mkdir -p) inside the agent's persistent volume.","operationId":"mkdir_agent_api_agents__agent_id__files_mkdir_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent 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/agents/{agent_id}/files/move":{"post":{"tags":["files"],"summary":"Move Agent File","description":"Rename or move a file/directory within the agent's persistent volume.\n\nFails loudly instead of guessing: 404 if the source doesn't exist and\n409 if the destination already does (`mv -n` alone would exit 0 and\nsilently do nothing on a collision).","operationId":"move_agent_file_api_agents__agent_id__files_move_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent 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/agents/{agent_id}/files/delete":{"delete":{"tags":["files"],"summary":"Delete Agent File","description":"Delete a file or directory (recursive) within the agent's persistent\nvolume.\n\nRefuses to delete the volume root itself, and returns 404 rather than a\nfake success when the path doesn't exist.","operationId":"delete_agent_file_api_agents__agent_id__files_delete_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"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/agents/{agent_id}/files/write":{"put":{"tags":["files"],"summary":"Write Agent File","description":"Write text content to a file inside the agent container (workspace editor).\n\nScoped to the agent's persistent volume, on whole path segments (so\n`/datafoo` is rejected for a /data-rooted agent).","operationId":"write_agent_file_api_agents__agent_id__files_write_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent 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/agents/{agent_id}/files/upload":{"post":{"tags":["files"],"summary":"Upload Agent File","description":"Push a file from the user into the agent's container.\n\nTwo modes:\n  - Chat attachment (no `dest_dir`): writes into the framework inbox with\n    a timestamp prefix and notifies the agent via /chat.\n  - File-manager upload (`dest_dir` under /data): writes into that exact\n    directory keeping the original name, no chat notice.\n\nReturns the in-container path the file landed at.","operationId":"upload_agent_file_api_agents__agent_id__files_upload_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_agent_file_api_agents__agent_id__files_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/exec":{"post":{"tags":["files","files"],"summary":"Exec In Agent","description":"Submits once, then waits for completion unless detachment is requested.","operationId":"exec_in_agent_api_agents__agent_id__exec_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent 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/agents/{agent_id}/exec/{execution_id}":{"get":{"tags":["files","files"],"summary":"Get Execution","description":"Returns a retained execution only after agent authorization.","operationId":"get_execution_api_agents__agent_id__exec__execution_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"execution_id","in":"path","required":true,"schema":{"type":"string","title":"Execution Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["files","files"],"summary":"Cancel Execution","description":"Explicitly cancels an execution after agent authorization.","operationId":"cancel_execution_api_agents__agent_id__exec__execution_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"execution_id","in":"path","required":true,"schema":{"type":"string","title":"Execution Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/internal/telegram/send":{"post":{"tags":["agent-internal"],"summary":"Telegram Send","description":"Push a text message to the user's Telegram chat for this agent.\n\nBody: `{\"text\": \"...\"}`. Returns 200 with the chat_id on success,\n401 if the bearer doesn't HMAC-match the agent_id, 404 if the\nagent has no Telegram binding, 503 if the shared bot isn't\nconfigured for this deployment.","operationId":"telegram_send_api_agents_internal_telegram_send_post","parameters":[{"name":"X-Maritime-Agent-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Maritime-Agent-Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"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/agents/internal/browser/request-login":{"post":{"tags":["agent-internal"],"summary":"Browser Request Login","description":"Open a Browserbase Live View session for the agent and DM the\nuser the URL via Telegram (optionally) so the user can interactively\nlog in to a third-party site.\n\nWorks for both Maritime-pool agents AND agents with user-supplied\nBROWSERBASE_API_KEY + BROWSERBASE_PROJECT_ID. For BYO-key agents,\nthe session is created under the user's own Browserbase account\nso cookies set during the takeover persist into the agent's later\nMCP sessions.\n\nBody (all optional): `{\"service\": \"facebook\"}`, a descriptor used in\nthe DM text. No state-tracking; session lives ~10 min on Browserbase's\nside, then auto-expires.\n\nReturns 200 with `{session_id, live_view_url, expires_at, telegram_delivered}`.\nErrors:\n  - 401: bad/missing internal token\n  - 404: agent not found\n  - 503: agent has no Browserbase credentials (no BYO key AND no pool)\n  - 502: Browserbase API call failed","operationId":"browser_request_login_api_agents_internal_browser_request_login_post","parameters":[{"name":"X-Maritime-Agent-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Maritime-Agent-Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"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/agents/internal/browser/close-login":{"post":{"tags":["agent-internal"],"summary":"Browser Close Login","description":"End a Live View session early once the agent confirms login worked.\n\nBody: `{\"session_id\": \"...\"}`. Idempotent: already-closed/expired\nsessions return 200. Cookies set during the session are persisted to\nthe agent's Context regardless of whether we explicitly close it\n(Browserbase's 600s timeout takes care of orphans).","operationId":"browser_close_login_api_agents_internal_browser_close_login_post","parameters":[{"name":"X-Maritime-Agent-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Maritime-Agent-Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"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/agents/internal/browser/mcp-session":{"post":{"tags":["agent-internal"],"summary":"Browser Mcp Session","description":"Record a Browserbase session that was opened by the\n@browserbasehq/mcp server (i.e. the agent called a browser tool,\nnot the explicit `maritime-request-login` flow).\n\nCalled by the maritime-bb-mcp-wrap shell wrapper around the bb-mcp\nbinary, which tails stderr for the SessionManager's\n\"Browserbase Live Debugger URL: .../sessions/<id>\" line and POSTs\neach session id here. Inserts a `browser_sessions` row so the\ndashboard's Live Browser panel (which polls\n`/api/agents/{id}/browser/live-view` and reads from that table)\nauto-expands for MCP-driven browsing, not only for the\n`maritime-request-login` path.\n\nIdempotent: `record_session_start` no-ops on duplicate session_id,\nso retries (wrapper restart, transient curl error) don't\ndouble-count.\n\nSession billing close still goes through `get_live_view`'s lazy\nreap (which marks `ended_at` but does NOT call `bill_session_close`,\nthe same gap as the request-login path; tracked separately).","operationId":"browser_mcp_session_api_agents_internal_browser_mcp_session_post","parameters":[{"name":"X-Maritime-Agent-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Maritime-Agent-Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"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/agents/internal/schedules":{"post":{"tags":["agent-internal"],"summary":"Push Schedules","description":"Tier C schedule push (plan 24 phase 3): the agent (via the SDK's\nobserveScheduler wrap, or plain curl) POSTs a read-only projection of\nits own scheduler the moment it changes:\n\n    {\"schedules\": [{\"id\": ..., \"nextRunAt\"?: ISO, \"cron\"?: \"5-field\",\n                    \"tz\"?: IANA, \"prompt\"?: str, \"name\"?: str}, ...]}\n\nThe list is reconciled AUTHORITATIVELY through the same byo_sync\nprovider the Tier B GET /schedules poll uses, so push and poll can\nnever fight: sending the full current list adds, updates, and\ngarbage-collects in one call. An empty list clears all synced wakes.\n\nReturns {\"upserted\": n, \"deleted\": n, \"desired\": n}.","operationId":"push_schedules_api_agents_internal_schedules_post","parameters":[{"name":"X-Maritime-Agent-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Maritime-Agent-Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"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/agents/{agent_id}/browser/live-view":{"get":{"tags":["agent-browser"],"summary":"Get Live View","operationId":"get_live_view_api_agents__agent_id__browser_live_view_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiveViewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/internal/oauth/start":{"post":{"tags":["oauth"],"summary":"Oauth Start","description":"Mint the OAuth authorize URL + DM it to the user via Telegram.\n\nBody: `{\"provider\": \"reddit\"}`. Returns the URL on success so\nthe agent can also surface it in chat for users without Telegram.\n\nErrors:\n  - 401 invalid auth\n  - 400 unknown provider\n  - 503 provider not configured on this backend\n  - 404 agent missing","operationId":"oauth_start_api_agents_internal_oauth_start_post","parameters":[{"name":"X-Maritime-Agent-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Maritime-Agent-Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"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/oauth/{provider_slug}/callback":{"get":{"tags":["oauth"],"summary":"Oauth Callback","description":"Public callback. Provider redirects the user here after they\napprove or deny on the provider's site.\n\nOn success: exchange code for tokens, persist as AES-encrypted env\nvars on the bound agent, optionally DM the user a success\nmessage, render a friendly HTML page.\n\nOn any failure: render an error page so the user knows what\nhappened. No tokens are persisted on partial failures.","operationId":"oauth_callback_api_oauth__provider_slug__callback_get","parameters":[{"name":"provider_slug","in":"path","required":true,"schema":{"type":"string","title":"Provider Slug"}},{"name":"state","in":"query","required":true,"schema":{"type":"string","title":"State"}},{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"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/templates":{"get":{"tags":["templates"],"summary":"Get Templates","operationId":"get_templates_api_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/email/inbound":{"post":{"tags":["email"],"summary":"Receive Email","description":"Receive inbound email from SendGrid/Mailgun parse webhook.\n\nSendGrid posts form data with: from, to, subject, text, html, etc.\nReturns ``accepted`` before the agent runs; see module docstring.","operationId":"receive_email_api_email_inbound_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/stripe/portal":{"post":{"tags":["stripe"],"summary":"Create Portal Session","description":"Create a Stripe Customer Portal session.","operationId":"create_portal_session_api_stripe_portal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerPortalResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/stripe/payment-methods":{"get":{"tags":["stripe"],"summary":"List Payment Methods","description":"List payment methods for the current user.","operationId":"list_payment_methods_api_stripe_payment_methods_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PaymentMethodResponse"},"type":"array","title":"Response List Payment Methods Api Stripe Payment Methods Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/stripe/subscriptions":{"get":{"tags":["stripe"],"summary":"List Subscriptions","description":"List subscriptions for the current user.","operationId":"list_subscriptions_api_stripe_subscriptions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SubscriptionResponse"},"type":"array","title":"Response List Subscriptions Api Stripe Subscriptions Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/stripe/invoices":{"get":{"tags":["stripe"],"summary":"List Invoices","description":"List invoices for the current user, each labeled with its product.","operationId":"list_invoices_api_stripe_invoices_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/InvoiceResponse"},"type":"array","title":"Response List Invoices Api Stripe Invoices Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/stripe/subscriptions/{subscription_id}/cancel":{"post":{"tags":["stripe"],"summary":"Cancel Subscription","description":"Cancel a subscription.","operationId":"cancel_subscription_api_stripe_subscriptions__subscription_id__cancel_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","title":"Subscription Id"}},{"name":"immediate","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Immediate"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stripe/webhook":{"post":{"tags":["stripe"],"summary":"Stripe Webhook","description":"Handle Stripe webhook events.","operationId":"stripe_webhook_api_stripe_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/wallet/balance":{"get":{"tags":["wallet"],"summary":"Get Balance","description":"Get current wallet balance. Auto-creates wallet if needed.","operationId":"get_balance_api_wallet_balance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletBalanceResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/wallet/plan-usage":{"get":{"tags":["wallet"],"summary":"Get Plan Usage","description":"Current plan + this user's aggregate usage against its limits.\n\nPowers the dashboard usage bars + upgrade prompts. NULL limit = unlimited.\n\nSeats accounts (every account since plan 37) answer from the seat plan:\nmachines included, the awake cap, and no storage or compute-minute caps,\nwhich plan_service's legacy tiers still carry but nothing enforces for\nthem. Showing those legacy numbers told free users they had 2 agents,\n1 GB and 300 minutes when the plan is 3 machines with 1 awake.","operationId":"get_plan_usage_api_wallet_plan_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/wallet/transactions":{"get":{"tags":["wallet"],"summary":"Get Transactions","description":"Get wallet transaction history. `wallet=llm` or `wallet=hosting`\nnarrows to one balance.","operationId":"get_transactions_api_wallet_transactions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"wallet","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wallet"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wallet/topup":{"post":{"tags":["wallet"],"summary":"Create Topup Checkout","description":"Create a Stripe Checkout session for wallet top-up (one-time payment).\n\nWallet-model (grandfathered) accounts only. On seats accounts the hosting\nbalance buys nothing — every charge is a Stripe subscription invoice — so\naccepting a top-up here would take real money for a balance no code path\ncan ever spend (the UI stopped offering it; the SDK and raw API had not).","operationId":"create_topup_checkout_api_wallet_topup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopUpRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/wallet/auto-recharge":{"get":{"tags":["wallet"],"summary":"Get Auto Recharge","operationId":"get_auto_recharge_api_wallet_auto_recharge_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["wallet"],"summary":"Set Auto Recharge","description":"Configure auto-recharge: below thresholdCents, charge the saved card\nfor amountCents (max 3x/24h, 6h backoff after a failed charge).\n\nEnabling requires a saved card RIGHT NOW (2026-07-17 decision): an\nopt-in that cannot charge is worse than none, because the user believes\nrefills are armed while the sweep fails forever. Callers get a 400 with\na machine-readable `code` (SDKs wrap this endpoint). Disabling is never\nblocked. The check is skipped only when Stripe itself is unconfigured\n(dev environments, where the sweep could not charge anyway).","operationId":"set_auto_recharge_api_wallet_auto_recharge_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoRechargeConfig"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/wallet/payment-method":{"get":{"tags":["wallet"],"summary":"Get Payment Method","description":"Saved-card status for the billing page.\n\nReports the exact card the auto-recharge sweep would charge (the shared\n`_pick_payment_method` pick: default PM, else the newest saved card) so\nthe UI can warn when auto-recharge has nothing workable to bill. Read\nonly: never creates a Stripe customer, and the Stripe lookups run in a\nworker thread so a slow Stripe API cannot stall the event loop on every\n/billing page load.\n\nShapes: {hasCard: true, brand, last4, expMonth, expYear, expired} or\n{hasCard: false, reason: not_configured|no_customer|no_card|stripe_error}.\nThe UI treats stripe_error/not_configured as unknown, not as missing.","operationId":"get_payment_method_api_wallet_payment_method_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/wallet/api-usage":{"get":{"tags":["wallet"],"summary":"Get Api Usage","description":"The AI credits of the account: budget, lifetime spend, what is left,\nand the unexpired welcome credit (``welcomeCredit``, None once spent or\nlapsed).","operationId":"get_api_usage_api_wallet_api_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/wallet/browser-usage":{"get":{"tags":["wallet"],"summary":"Get Browser Usage","description":"Browser session usage + rate for the authenticated user.\n\nSessions are debited from the same wallet as hosting compute (see\n`services/browserbase_pool.bill_session_close`), at\n`settings.browserbase_rate_per_hour_cents`. Only pooled sessions\n(Maritime-supplied Browserbase) are billed. User-key sessions\nreturn `cost_cents = 0`.","operationId":"get_browser_usage_api_wallet_browser_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/wallet/api-credits":{"post":{"tags":["wallet"],"summary":"Purchase Api Credits","description":"Creates a Stripe Checkout session that buys AI credits.\n\nThe session is a one-time payment on the account's Stripe customer.\n``invoice_creation`` is on so the purchase produces a Stripe invoice\n(receipt PDF in the portal, a row in the invoice history), tagged\n``type=ai_credits`` like the Checkout session itself. The webhook for\n``checkout.session.completed`` raises the budget; the invoice events\nfor this invoice match no billing engine and only sync the receipt.","operationId":"purchase_api_credits_api_wallet_api_credits_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiCreditsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/wallet/validate-code":{"post":{"tags":["wallet"],"summary":"Validate Promo Code","description":"Retired. Kept unauthenticated (it always was) so old signup flows get\na stable shape instead of an error they cannot parse.","operationId":"validate_promo_code_api_wallet_validate_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wallet/redeem":{"post":{"tags":["wallet"],"summary":"Redeem Promo","description":"Retired. 410 tells old clients the feature is gone on purpose.","operationId":"redeem_promo_api_wallet_redeem_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wallet/signup-bonus":{"post":{"tags":["wallet"],"summary":"Claim Signup Bonus","description":"One-time $10 OpenClaw signup bonus. Idempotent: replays return the\nexisting balance without double-crediting.\n\nAmount is server-controlled (SIGNUP_BONUS_CENTS); the caller has no input\nbeyond their authenticated identity. Replaces the legacy pattern of having\nthe frontend call /api/wallet/credit directly (AUTH-002).\n\nSeats accounts (every account since 2026-07-31) get a 200 no-op: hosting\ncredit buys nothing on seats, so minting it is pure ledger noise — but\nthe response MUST stay 200 because the openclaw deploy flow\n(frontend /api/openclaw/deploy) treats any non-ok here as fatal and\naborts the whole signup.","operationId":"claim_signup_bonus_api_wallet_signup_bonus_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/wallet/check-deploy":{"post":{"tags":["wallet"],"summary":"Check Deploy Balance","description":"Check if user has sufficient balance to deploy an agent.","operationId":"check_deploy_balance_api_wallet_check_deploy_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/keys":{"get":{"tags":["api-keys"],"summary":"List Api Keys","operationId":"list_api_keys_api_v1_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ApiKeyResponse"},"type":"array","title":"Response List Api Keys Api V1 Keys Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["api-keys"],"summary":"Create Api Key","description":"Create a new API key. The raw key is returned only once.","operationId":"create_api_key_api_v1_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/keys/{key_id}":{"delete":{"tags":["api-keys"],"summary":"Revoke Api Key","operationId":"revoke_api_key_api_v1_keys__key_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/gateway-config":{"get":{"tags":["gateway-config"],"summary":"Get Gateway Config","description":"Read gateway channels: from the live container when active, else from stored boot config.","operationId":"get_gateway_config_api_agents__agent_id__gateway_config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/telegram/validate":{"post":{"tags":["gateway-config"],"summary":"Validate Telegram Token","description":"Validate a BotFather token via Telegram getMe (no container required).","operationId":"validate_telegram_token_api_agents__agent_id__telegram_validate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelegramValidateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/gateway-config/channels":{"put":{"tags":["gateway-config"],"summary":"Update Channels","description":"Update gateway channels. Telegram can be saved while the agent is sleeping.","operationId":"update_channels_api_agents__agent_id__gateway_config_channels_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelConfig"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm/v1/{path}":{"post":{"tags":["llm-proxy"],"summary":"Proxy Openai","description":"Proxy any OpenAI v1/* endpoint.","operationId":"proxy_openai_api_llm_v1__path__post","parameters":[{"name":"path","in":"path","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"}}}}}},"get":{"tags":["llm-proxy"],"summary":"Proxy Openai","description":"Proxy any OpenAI v1/* endpoint.","operationId":"proxy_openai_api_llm_v1__path__post","parameters":[{"name":"path","in":"path","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/inkbox/{agent_id}":{"get":{"tags":["inkbox"],"summary":"Get Inkbox Identity","description":"Return the Inkbox identity info (phone number, email) for an agent.","operationId":"get_inkbox_identity_api_inkbox__agent_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/maritime-telegram":{"get":{"tags":["maritime-telegram"],"summary":"Get Maritime Telegram Status","description":"Return current binding state: not_connected | pending | bound.\n\nWhen the binding is `not_connected` but the user already has *another*\nagent connected via the shared bot, the response includes an\n`other_bound_agent` block so the UI can warn inline instead of letting\nthe user click Connect and hit a 409.","operationId":"get_maritime_telegram_status_api_agents__agent_id__maritime_telegram_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["maritime-telegram"],"summary":"Disconnect Maritime Telegram","description":"Remove this agent's binding to the shared Maritime bot.","operationId":"disconnect_maritime_telegram_api_agents__agent_id__maritime_telegram_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/maritime-telegram/connect":{"post":{"tags":["maritime-telegram"],"summary":"Connect Maritime Telegram","description":"Issue a one-tap deep link the user opens in Telegram.\n\nIf the agent already has a Maritime-bot binding, returns its status\ninstead of generating a new link. Also removes any existing\ncustom-bot Telegram trigger so the two paths don't both poll.","operationId":"connect_maritime_telegram_api_agents__agent_id__maritime_telegram_connect_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/whatsapp-v2/start":{"post":{"tags":["whatsapp-v2"],"summary":"Start","operationId":"start_api_agents__agent_id__whatsapp_v2_start_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/whatsapp-v2/status":{"get":{"tags":["whatsapp-v2"],"summary":"Status","operationId":"status_api_agents__agent_id__whatsapp_v2_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/whatsapp-v2/cancel":{"post":{"tags":["whatsapp-v2"],"summary":"Cancel","operationId":"cancel_api_agents__agent_id__whatsapp_v2_cancel_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/whatsapp-v2/log":{"get":{"tags":["whatsapp-v2"],"summary":"Log","description":"Return the last ~4KB of helper stdout/stderr for debugging.","operationId":"log_api_agents__agent_id__whatsapp_v2_log_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/whatsapp-v2/pairings":{"get":{"tags":["whatsapp-v2"],"summary":"List Pairings","description":"Return the WhatsApp pending pairing list + current allowlist.","operationId":"list_pairings_api_agents__agent_id__whatsapp_v2_pairings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/whatsapp-v2/pairings/{code}/approve":{"post":{"tags":["whatsapp-v2"],"summary":"Approve Pairing","operationId":"approve_pairing_api_agents__agent_id__whatsapp_v2_pairings__code__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"code","in":"path","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/agents/{agent_id}/whatsapp-v2/pairings/{code}/deny":{"post":{"tags":["whatsapp-v2"],"summary":"Deny Pairing","operationId":"deny_pairing_api_agents__agent_id__whatsapp_v2_pairings__code__deny_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"code","in":"path","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/agents/{agent_id}/hermes/pairings":{"get":{"tags":["hermes-pairing"],"summary":"List Pairings","description":"Pending pairing requests + approved contacts across all platforms.\n\nReturns ``agentRunning: false`` (instead of erroring) when the agent is\nasleep so the UI can offer a Start affordance.","operationId":"list_pairings_api_agents__agent_id__hermes_pairings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/hermes/pairings/approve":{"post":{"tags":["hermes-pairing"],"summary":"Approve Code","description":"Approve a one-time pairing code the contact relayed.","operationId":"approve_code_api_agents__agent_id__hermes_pairings_approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent 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/agents/{agent_id}/hermes/pairings/allow":{"post":{"tags":["hermes-pairing"],"summary":"Allow Contact","description":"Pre-approve a contact by identity. No pairing code required.","operationId":"allow_contact_api_agents__agent_id__hermes_pairings_allow_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent 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/agents/{agent_id}/hermes/pairings/revoke":{"post":{"tags":["hermes-pairing"],"summary":"Revoke Contact","description":"Remove a contact from the approved list.","operationId":"revoke_contact_api_agents__agent_id__hermes_pairings_revoke_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent 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/gmail/authorize/{agent_id}":{"get":{"tags":["gmail-connect"],"summary":"Gmail Authorize","description":"Generate Google OAuth consent URL for Gmail access.\n\nReturns a URL that the frontend opens in a popup window.\nAfter consent, Google redirects to /api/gmail/callback.","operationId":"gmail_authorize_api_gmail_authorize__agent_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gmail/callback":{"get":{"tags":["gmail-connect"],"summary":"Gmail Callback","description":"Handle Google OAuth callback.\n\nExchanges the authorization code for tokens, stores them encrypted,\nand returns an HTML page that closes the popup and notifies the parent.","operationId":"gmail_callback_api_gmail_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/gmail/connect":{"post":{"tags":["gmail-connect"],"summary":"Gmail Connect","description":"Inject Gmail credentials into the running agent container.\n\nWrites the MCP tool server script and configures openclaw.json\nto use it. Called after OAuth is complete and agent is running.","operationId":"gmail_connect_api_agents__agent_id__gmail_connect_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/gmail/enable":{"post":{"tags":["gmail-connect"],"summary":"Gmail Enable","description":"Backward-compatible alias for older frontend calls.","operationId":"gmail_enable_api_agents__agent_id__gmail_enable_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/gmail/status":{"get":{"tags":["gmail-connect"],"summary":"Gmail Status","description":"Check whether Gmail is connected for this agent.","operationId":"gmail_status_api_agents__agent_id__gmail_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/gmail/disconnect":{"post":{"tags":["gmail-connect"],"summary":"Gmail Disconnect","description":"Disconnect Gmail: remove credentials, clean container, delete trigger.","operationId":"gmail_disconnect_api_agents__agent_id__gmail_disconnect_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/upload/zip":{"post":{"tags":["upload"],"summary":"Upload Zip","description":"Upload a ZIP file of source code for agent deployment.\n\nValidates the ZIP, converts to tar.gz, uploads to S3, and returns\nmetadata about the upload (S3 key, detected Dockerfile, file list).","operationId":"upload_zip_api_upload_zip_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_zip_api_upload_zip_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":[{"HTTPBearer":[]}]}},"/api/agents/{agent_id}/capabilities":{"get":{"tags":["capabilities"],"summary":"Get Agent Capabilities","operationId":"get_agent_capabilities_api_agents__agent_id__capabilities_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["capabilities"],"summary":"Mutate Agent Capability","operationId":"mutate_agent_capability_api_agents__agent_id__capabilities_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapabilityRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/computers":{"post":{"tags":["computers"],"summary":"Get or create a computer for an end user","operationId":"computers.create","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComputerCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComputerOut"}}}},"402":{"description":"Plan or quota refusal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"A person is in control of the computer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"Computers disabled or no capacity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["computers"],"summary":"List computers","operationId":"computers.list","security":[{"HTTPBearer":[]}],"parameters":[{"name":"externalUserId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Externaluserid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComputerListOut"}}}},"402":{"description":"Plan or quota refusal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"A person is in control of the computer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"Computers disabled or no capacity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/computers/usage":{"get":{"tags":["computers"],"summary":"Invocation usage for a period","operationId":"computers.usage","security":[{"HTTPBearer":[]}],"parameters":[{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To"}},{"name":"externalUserId","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Externaluserid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageOut"}}}},"402":{"description":"Plan or quota refusal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"A person is in control of the computer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"Computers disabled or no capacity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/computers/{computer_id}":{"get":{"tags":["computers"],"summary":"Get a computer","operationId":"computers.get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"computer_id","in":"path","required":true,"schema":{"type":"string","title":"Computer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComputerOut"}}}},"402":{"description":"Plan or quota refusal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"A person is in control of the computer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"Computers disabled or no capacity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["computers"],"summary":"Delete a computer, its volume, and its snapshots","operationId":"computers.delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"computer_id","in":"path","required":true,"schema":{"type":"string","title":"Computer Id"}}],"responses":{"204":{"description":"Successful Response"},"402":{"description":"Plan or quota refusal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"A person is in control of the computer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"Computers disabled or no capacity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/computers/{computer_id}/wake":{"post":{"tags":["computers"],"summary":"Wake a computer (free; opens no session)","operationId":"computers.wake","security":[{"HTTPBearer":[]}],"parameters":[{"name":"computer_id","in":"path","required":true,"schema":{"type":"string","title":"Computer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WakeOut"}}}},"402":{"description":"Plan or quota refusal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"A person is in control of the computer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"Computers disabled or no capacity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/computers/{computer_id}/sleep":{"post":{"tags":["computers"],"summary":"Sleep a computer (closes the open session)","operationId":"computers.sleep","security":[{"HTTPBearer":[]}],"parameters":[{"name":"computer_id","in":"path","required":true,"schema":{"type":"string","title":"Computer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComputerOut"}}}},"402":{"description":"Plan or quota refusal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"A person is in control of the computer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"Computers disabled or no capacity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/computers/{computer_id}/actions":{"post":{"tags":["computers"],"summary":"Run one canonical action or a batch","operationId":"computers.actions","security":[{"HTTPBearer":[]}],"parameters":[{"name":"computer_id","in":"path","required":true,"schema":{"type":"string","title":"Computer Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ActionRequest"},{"$ref":"#/components/schemas/BatchRequest"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ActionResult"},{"$ref":"#/components/schemas/BatchResult"}],"title":"Response Computers.Actions"}}}},"402":{"description":"Plan or quota refusal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"A person is in control of the computer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"Computers disabled or no capacity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/computers/{computer_id}/screenshot":{"get":{"tags":["computers"],"summary":"Screenshot as image bytes","operationId":"computers.screenshot","security":[{"HTTPBearer":[]}],"parameters":[{"name":"computer_id","in":"path","required":true,"schema":{"type":"string","title":"Computer Id"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(png|jpeg)$","default":"png","title":"Format"}},{"name":"quality","in":"query","required":false,"schema":{"type":"integer","maximum":95,"minimum":1,"default":80,"title":"Quality"}}],"responses":{"200":{"description":"Image bytes","content":{"image/png":{},"image/jpeg":{}}},"402":{"description":"Plan or quota refusal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"A person is in control of the computer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"Computers disabled or no capacity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/computers/{computer_id}/exec":{"post":{"tags":["computers"],"summary":"Run a shell command inside the computer","operationId":"computers.exec","security":[{"HTTPBearer":[]}],"parameters":[{"name":"computer_id","in":"path","required":true,"schema":{"type":"string","title":"Computer Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecOut"}}}},"402":{"description":"Plan or quota refusal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"A person is in control of the computer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"Computers disabled or no capacity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/computers/{computer_id}/files":{"get":{"tags":["computers"],"summary":"Read a file (raw bytes)","operationId":"computers.files.read","security":[{"HTTPBearer":[]}],"parameters":[{"name":"computer_id","in":"path","required":true,"schema":{"type":"string","title":"Computer Id"}},{"name":"path","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Path"}}],"responses":{"200":{"description":"File bytes","content":{"application/octet-stream":{}}},"402":{"description":"Plan or quota refusal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"A person is in control of the computer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"Computers disabled or no capacity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["computers"],"summary":"Write a file (raw body)","operationId":"computers.files.write","security":[{"HTTPBearer":[]}],"parameters":[{"name":"computer_id","in":"path","required":true,"schema":{"type":"string","title":"Computer Id"}},{"name":"path","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Path"}}],"responses":{"204":{"description":"Successful Response"},"402":{"description":"Plan or quota refusal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"A person is in control of the computer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"Computers disabled or no capacity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/computers/{computer_id}/files/list":{"get":{"tags":["computers"],"summary":"List a directory","operationId":"computers.files.list","security":[{"HTTPBearer":[]}],"parameters":[{"name":"computer_id","in":"path","required":true,"schema":{"type":"string","title":"Computer Id"}},{"name":"path","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileListOut"}}}},"402":{"description":"Plan or quota refusal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"A person is in control of the computer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"Computers disabled or no capacity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/computers/{computer_id}/viewer":{"post":{"tags":["computers"],"summary":"Mint a viewer link (watch or control)","operationId":"computers.viewer","security":[{"HTTPBearer":[]}],"parameters":[{"name":"computer_id","in":"path","required":true,"schema":{"type":"string","title":"Computer Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViewerRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViewerOut"}}}},"402":{"description":"Plan or quota refusal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"A person is in control of the computer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"Computers disabled or no capacity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/computers/{computer_id}/sessions/close":{"post":{"tags":["computers"],"summary":"Close the open session (30 s grace before sleep)","operationId":"computers.sessions.close","security":[{"HTTPBearer":[]}],"parameters":[{"name":"computer_id","in":"path","required":true,"schema":{"type":"string","title":"Computer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionOut"}}}},"402":{"description":"Plan or quota refusal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"A person is in control of the computer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"Computers disabled or no capacity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"204":{"description":"No open session"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/computers/{computer_id}/sessions":{"get":{"tags":["computers"],"summary":"List recent sessions (invocations)","operationId":"computers.sessions.list","security":[{"HTTPBearer":[]}],"parameters":[{"name":"computer_id","in":"path","required":true,"schema":{"type":"string","title":"Computer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionListOut"}}}},"402":{"description":"Plan or quota refusal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"A person is in control of the computer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"Computers disabled or no capacity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/computers/{computer_id}/takeover/complete":{"post":{"tags":["computers"],"summary":"Hand control back to the agent (viewer token, control mode)","operationId":"computers.takeover.complete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"computer_id","in":"path","required":true,"schema":{"type":"string","title":"Computer Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TakeoverCompleteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TakeoverCompleteOut"}}}},"402":{"description":"Plan or quota refusal","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"409":{"description":"A person is in control of the computer","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"503":{"description":"Computers disabled or no capacity","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/computers/plan":{"get":{"tags":["computers-dashboard"],"summary":"Get Plan","description":"What the account's one plan allows, and how much of it computers use.\n\nPlan 37 deleted the checkout, portal, cancel and resume routes that used\nto sit here. They sold a second subscription for the same machine, so an\naccount could hold two. A plan is bought once, on the Billing page, and\n``billing_url`` is where this page sends anyone who needs to change it.","operationId":"get_plan_api_computers_plan_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanStatusOut"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/computers/list":{"get":{"tags":["computers-dashboard"],"summary":"List Computers","operationId":"list_computers_api_computers_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComputerListOut"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/computers/create":{"post":{"tags":["computers-dashboard"],"summary":"Create Computer","description":"Creates and boots one computer for the signed-in account.\n\nThe computer has no end user (it is anonymous), so every call creates a\nnew one. The account's plan limits apply as they do for a key.","operationId":"create_computer_api_computers_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardComputerCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComputerOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/computers/{computer_id}/viewer":{"post":{"tags":["computers-dashboard"],"summary":"Mint Viewer","operationId":"mint_viewer_api_computers__computer_id__viewer_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"computer_id","in":"path","required":true,"schema":{"type":"string","title":"Computer Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViewerRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ViewerOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/computers/{computer_id}/sessions":{"get":{"tags":["computers-dashboard"],"summary":"List Sessions","description":"The computer's recent sessions, newest first, for the dashboard drawer.","operationId":"list_sessions_api_computers__computer_id__sessions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"computer_id","in":"path","required":true,"schema":{"type":"string","title":"Computer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/computers/{computer_id}/wake":{"post":{"tags":["computers-dashboard"],"summary":"Wake Computer","operationId":"wake_computer_api_computers__computer_id__wake_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"computer_id","in":"path","required":true,"schema":{"type":"string","title":"Computer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WakeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/computers/{computer_id}/sleep":{"post":{"tags":["computers-dashboard"],"summary":"Sleep Computer","operationId":"sleep_computer_api_computers__computer_id__sleep_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"computer_id","in":"path","required":true,"schema":{"type":"string","title":"Computer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComputerOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/computers/{computer_id}":{"delete":{"tags":["computers-dashboard"],"summary":"Delete Computer","operationId":"delete_computer_api_computers__computer_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"computer_id","in":"path","required":true,"schema":{"type":"string","title":"Computer Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/me":{"get":{"tags":["organizations"],"summary":"Me","description":"The person, the organization they act in, the one they own, and the others they belong to.","operationId":"me_api_organizations_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/organizations":{"post":{"tags":["organizations"],"summary":"Create Organization","description":"Create the caller's organization: their account, shared with the people they invite.","operationId":"create_organization_api_organizations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/organizations/{organization_id}":{"patch":{"tags":["organizations"],"summary":"Rename Organization","description":"Rename the organization. Admins and the owner.","operationId":"rename_organization_api_organizations__organization_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["organizations"],"summary":"Delete Organization","description":"Delete the organization. Owner only. Members lose access; the owner's agents, keys, and plan stay.","operationId":"delete_organization_api_organizations__organization_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{organization_id}/members":{"get":{"tags":["organizations"],"summary":"List Members","operationId":"list_members_api_organizations__organization_id__members_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MemberResponse"},"title":"Response List Members Api Organizations  Organization Id  Members Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{organization_id}/members/{user_id}":{"patch":{"tags":["organizations"],"summary":"Change Member Role","operationId":"change_member_role_api_organizations__organization_id__members__user_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberRoleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["organizations"],"summary":"Remove Member","description":"Remove a member. The owner's agents and keys are not affected.","operationId":"remove_member_api_organizations__organization_id__members__user_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{organization_id}/leave":{"post":{"tags":["organizations"],"summary":"Leave Organization","operationId":"leave_organization_api_organizations__organization_id__leave_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{organization_id}/invites":{"post":{"tags":["organizations"],"summary":"Create Invite","description":"Invite one email. Sends the link by email, or returns it when email is off.","operationId":"create_invite_api_organizations__organization_id__invites_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["organizations"],"summary":"List Invites","operationId":"list_invites_api_organizations__organization_id__invites_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InviteResponse"},"title":"Response List Invites Api Organizations  Organization Id  Invites Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{organization_id}/invites/{invite_id}":{"delete":{"tags":["organizations"],"summary":"Revoke Invite","operationId":"revoke_invite_api_organizations__organization_id__invites__invite_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}},{"name":"invite_id","in":"path","required":true,"schema":{"type":"string","title":"Invite Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/organizations/{organization_id}/invites/{invite_id}/resend":{"post":{"tags":["organizations"],"summary":"Resend Invite","operationId":"resend_invite_api_organizations__organization_id__invites__invite_id__resend_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","title":"Organization Id"}},{"name":"invite_id","in":"path","required":true,"schema":{"type":"string","title":"Invite Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/invites/{token}":{"get":{"tags":["organizations"],"summary":"Preview Invite","description":"Who invited you where. Needs no session.","operationId":"preview_invite_api_invites__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitePreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/invites/{token}/accept":{"post":{"tags":["organizations"],"summary":"Accept Invite","description":"Accept an invite as the signed in person.","operationId":"accept_invite_api_invites__token__accept_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteAcceptedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/signed-webhook":{"put":{"tags":["signed-webhooks"],"summary":"Put Signed Webhook","description":"Sets the agent's one signed webhook address. Replaces an earlier one.","operationId":"put_signed_webhook_api_agents__agent_id__signed_webhook_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignedWebhookUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignedWebhookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["signed-webhooks"],"summary":"Get Signed Webhook","description":"Returns the agent's signed webhook address. The secret is never returned.","operationId":"get_signed_webhook_api_agents__agent_id__signed_webhook_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignedWebhookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["signed-webhooks"],"summary":"Delete Signed Webhook","description":"Removes the agent's signed webhook address. The public route then returns 404.","operationId":"delete_signed_webhook_api_agents__agent_id__signed_webhook_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/w/{agent_id}/{path}":{"post":{"tags":["signed-webhooks"],"summary":"Deliver Signed Webhook","description":"Forwards one signed delivery to the agent, waking it first if it sleeps.\n\nThe order matters: the address and the signature are checked before the\nagent is touched, so a sender without the secret cannot wake the agent.\nA missing agent, a missing setting and a wrong path all return the same\n404, so the route does not reveal which agents exist.","operationId":"deliver_signed_webhook_w__agent_id___path__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"path","in":"path","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/agents/{agent_id}/llm-spend-limit":{"get":{"tags":["llm-spend-limits"],"summary":"Get Agent Spend Limit","description":"Returns the limit that applies to the agent and its spend this month.","operationId":"get_agent_spend_limit_api_agents__agent_id__llm_spend_limit_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSpendLimitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["llm-spend-limits"],"summary":"Put Agent Spend Limit","description":"Sets the agent's own monthly limit. A null limit means no limit for this agent.","operationId":"put_agent_spend_limit_api_agents__agent_id__llm_spend_limit_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSpendLimitUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSpendLimitResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["llm-spend-limits"],"summary":"Delete Agent Spend Limit","description":"Removes the agent's own limit, so the agent follows the account default.","operationId":"delete_agent_spend_limit_api_agents__agent_id__llm_spend_limit_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/llm-spend-limit/default":{"get":{"tags":["llm-spend-limits"],"summary":"Get Account Default","description":"Returns the account default. The limit is null when the account has none.","operationId":"get_account_default_api_llm_spend_limit_default_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDefaultResponse"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["llm-spend-limits"],"summary":"Put Account Default","description":"Sets the monthly limit for each agent that has no limit of its own.","operationId":"put_account_default_api_llm_spend_limit_default_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDefaultUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountDefaultResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]},"delete":{"tags":["llm-spend-limits"],"summary":"Delete Account Default","description":"Removes the account default.","operationId":"delete_account_default_api_llm_spend_limit_default_delete","responses":{"204":{"description":"Successful Response"}},"security":[{"HTTPBearer":[]}]}},"/api/agents/{agent_id}/activity":{"get":{"tags":["agent-activity"],"summary":"Get Agent Activity","description":"Returns the stored events of the agent, newest first.","operationId":"get_agent_activity_api_agents__agent_id__activity_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only entries strictly older than this ISO timestamp (pagination cursor).","title":"Before"},"description":"Only entries strictly older than this ISO timestamp (pagination cursor)."},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"enum":["trigger_fired","llm_call","tool_call","lifecycle","error","outcome"],"type":"string"},{"type":"null"}],"title":"Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/llm-calls":{"get":{"tags":["agent-activity"],"summary":"Get Agent Llm Calls","description":"Returns the metered LLM calls of the agent with tokens and cost, newest first.","operationId":"get_agent_llm_calls_api_agents__agent_id__llm_calls_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only entries strictly older than this ISO timestamp (pagination cursor).","title":"Before"},"description":"Only entries strictly older than this ISO timestamp (pagination cursor)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LlmCallPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/unclaimed/agents":{"post":{"tags":["unclaimed"],"summary":"Create Unclaimed Agent","description":"Creates one agent in a throwaway account and returns its key and claim URL. No auth.","operationId":"create_unclaimed_agent_api_unclaimed_agents_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnclaimedAgentCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnclaimedAgentCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/claims/{token}":{"get":{"tags":["unclaimed"],"summary":"Preview Claim","description":"Returns what the claim page shows for ``token``. No auth.","operationId":"preview_claim_api_claims__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/claims/{token}/accept":{"post":{"tags":["unclaimed"],"summary":"Accept Claim","description":"Moves the claimed agent into the signed-in account. The claimer must be email-verified.","operationId":"accept_claim_api_claims__token__accept_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimAcceptedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agents/{agent_id}/restart-operations":{"post":{"summary":"Accept","description":"Passes authenticated request identity to the durable acceptance owner.","operationId":"accept_agents__agent_id__restart_operations_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestartRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agents/{agent_id}/restart-operations/{operation_id}":{"get":{"summary":"Inspect","description":"Passes authenticated inspection through the resource access boundary.","operationId":"inspect_agents__agent_id__restart_operations__operation_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","title":"Operation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AccountDefaultResponse":{"properties":{"monthlyLimitCents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthlylimitcents"}},"type":"object","required":["monthlyLimitCents"],"title":"AccountDefaultResponse"},"AccountDefaultUpdate":{"properties":{"monthlyLimitCents":{"type":"integer","maximum":1000000.0,"minimum":0.0,"title":"Monthlylimitcents"}},"type":"object","required":["monthlyLimitCents"],"title":"AccountDefaultUpdate"},"AccountDeleteRequest":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"AccountDeleteRequest","description":"Optional body for account deletion: a free-text exit reason."},"ActionRequest":{"properties":{"action":{"type":"string","title":"Action"},"coordinate":{"anyOf":[{"items":{"type":"integer"},"type":"array","maxItems":2,"minItems":2},{"type":"null"}],"title":"Coordinate"},"startCoordinate":{"anyOf":[{"items":{"type":"integer"},"type":"array","maxItems":2,"minItems":2},{"type":"null"}],"title":"Startcoordinate"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"modifier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Modifier"},"key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"},"repeat":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Repeat"},"scrollDirection":{"anyOf":[{"type":"string","enum":["up","down","left","right"]},{"type":"null"}],"title":"Scrolldirection"},"scrollAmount":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Scrollamount"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration"},"region":{"anyOf":[{"items":{"type":"integer"},"type":"array","maxItems":4,"minItems":4},{"type":"null"}],"title":"Region"},"package":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Package"},"url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Url"},"path":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Path"},"detail":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Detail"},"noScreenshot":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Noscreenshot"},"format":{"anyOf":[{"type":"string","enum":["png","jpeg"]},{"type":"null"}],"title":"Format"},"quality":{"anyOf":[{"type":"integer","maximum":95.0,"minimum":1.0},{"type":"null"}],"title":"Quality"}},"type":"object","required":["action"],"title":"ActionRequest","description":"One canonical desktopd action (desktopd/mcp_server.py COMPUTER_PROPS shape)."},"ActionResult":{"properties":{"action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"},"ok":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ok"},"isError":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Iserror"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"frameId":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Frameid"},"imageB64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imageb64"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"mime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mime"},"scale":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Scale"},"coordinate":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Coordinate"},"blocked":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Blocked"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hint"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"additionalProperties":true,"type":"object","title":"ActionResult","description":"A desktopd action result with camelCase names; extra detail keys pass through."},"ActivityEvent":{"properties":{"id":{"type":"string","title":"Id"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"type":{"type":"string","enum":["trigger_fired","llm_call","tool_call","lifecycle","error","outcome"],"title":"Type"},"success":{"type":"boolean","title":"Success"},"triggerType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Triggertype"},"toolName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Toolname"},"llmModel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llmmodel"},"lifecyclePhase":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lifecyclephase"},"errorClass":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Errorclass"},"promptTokens":{"type":"integer","title":"Prompttokens"},"completionTokens":{"type":"integer","title":"Completiontokens"},"latencyMs":{"type":"integer","title":"Latencyms"}},"type":"object","required":["id","timestamp","type","success","triggerType","toolName","llmModel","lifecyclePhase","errorClass","promptTokens","completionTokens","latencyMs"],"title":"ActivityEvent"},"ActivityPage":{"properties":{"events":{"items":{"$ref":"#/components/schemas/ActivityEvent"},"type":"array","title":"Events"},"nextBefore":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Nextbefore"}},"type":"object","required":["events","nextBefore"],"title":"ActivityPage"},"AdminComputerListOut":{"properties":{"computers":{"items":{"$ref":"#/components/schemas/AdminComputerOut"},"type":"array","title":"Computers"}},"type":"object","required":["computers"],"title":"AdminComputerListOut"},"AdminComputerOut":{"properties":{"id":{"type":"string","title":"Id"},"os":{"type":"string","enum":["linux","windows","android"],"title":"Os","default":"linux"},"arch":{"type":"string","enum":["x86_64","arm64"],"title":"Arch","default":"x86_64"},"externalUserId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Externaluserid"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"status":{"type":"string","title":"Status"},"screen":{"$ref":"#/components/schemas/ScreenOut"},"mode":{"type":"string","title":"Mode"},"modeReason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Modereason"},"takeoverSeq":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Takeoverseq"},"takeoverExpiresAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Takeoverexpiresat"},"lastTakeoverResult":{"anyOf":[{"type":"string","enum":["success","failed","expired"]},{"type":"null"}],"title":"Lasttakeoverresult"},"lastTakeoverNote":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lasttakeovernote"},"lastActionAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastactionat"},"lastWakeMs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lastwakems"},"lastWakeMethod":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastwakemethod"},"errorMessage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Errormessage"},"session":{"anyOf":[{"$ref":"#/components/schemas/SessionSummaryOut"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"userId":{"type":"string","title":"Userid"},"projectId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Projectid"},"serverId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Serverid"},"vmId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vmid"}},"type":"object","required":["id","status","screen","mode","createdAt","userId"],"title":"AdminComputerOut","description":"``ComputerOut`` plus the fields only an operator may see.\n\n``error_message`` is NOT redeclared here: ``ComputerOut`` already carries\nit, so ``**base`` supplies it and passing it again raised TypeError on\nevery call, which made both admin routes answer 500."},"AdminComputerRowOut":{"properties":{"id":{"type":"string","title":"Id"},"os":{"type":"string","enum":["linux","windows","android"],"title":"Os","default":"linux"},"arch":{"type":"string","enum":["x86_64","arm64"],"title":"Arch","default":"x86_64"},"externalUserId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Externaluserid"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"status":{"type":"string","title":"Status"},"screen":{"$ref":"#/components/schemas/ScreenOut"},"mode":{"type":"string","title":"Mode"},"modeReason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Modereason"},"takeoverSeq":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Takeoverseq"},"takeoverExpiresAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Takeoverexpiresat"},"lastTakeoverResult":{"anyOf":[{"type":"string","enum":["success","failed","expired"]},{"type":"null"}],"title":"Lasttakeoverresult"},"lastTakeoverNote":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lasttakeovernote"},"lastActionAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastactionat"},"lastWakeMs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lastwakems"},"lastWakeMethod":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastwakemethod"},"errorMessage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Errormessage"},"session":{"anyOf":[{"$ref":"#/components/schemas/SessionSummaryOut"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"userId":{"type":"string","title":"Userid"},"projectId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Projectid"},"serverId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Serverid"},"vmId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vmid"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"serverName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Servername"},"openSessionStartedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Opensessionstartedat"},"lastStartedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Laststartedat"},"snapshotKeptUntil":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Snapshotkeptuntil"},"snapshotDroppedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Snapshotdroppedat"},"updatedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updatedat"}},"type":"object","required":["id","status","screen","mode","createdAt","userId"],"title":"AdminComputerRowOut"},"AdminHostOut":{"properties":{"serverId":{"type":"string","title":"Serverid"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"registered":{"type":"boolean","title":"Registered"},"reachable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reachable"},"persisted":{"type":"integer","title":"Persisted"},"persistedLimit":{"type":"integer","title":"Persistedlimit"},"liveVms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Livevms"},"deadVms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Deadvms"},"orphanVms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Orphanvms"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["serverId","registered","persisted","persistedLimit"],"title":"AdminHostOut"},"AdminOverviewOut":{"properties":{"product":{"$ref":"#/components/schemas/AdminProductOut"},"totals":{"$ref":"#/components/schemas/AdminTotalsOut"},"hosts":{"items":{"$ref":"#/components/schemas/AdminHostOut"},"type":"array","title":"Hosts"},"tenants":{"items":{"$ref":"#/components/schemas/AdminTenantRowOut"},"type":"array","title":"Tenants"},"computers":{"items":{"$ref":"#/components/schemas/AdminComputerRowOut"},"type":"array","title":"Computers"},"recentSessions":{"items":{"$ref":"#/components/schemas/AdminSessionRowOut"},"type":"array","title":"Recentsessions"}},"type":"object","required":["product","totals","hosts","tenants","computers","recentSessions"],"title":"AdminOverviewOut"},"AdminProductOut":{"properties":{"state":{"type":"string","title":"State"},"image":{"type":"string","title":"Image"},"serverIds":{"items":{"type":"string"},"type":"array","title":"Serverids"},"mcpUrlConfigured":{"type":"boolean","title":"Mcpurlconfigured"},"maxPerPlan":{"type":"integer","title":"Maxperplan"},"maxPersistedPerHost":{"type":"integer","title":"Maxpersistedperhost"},"ownerTag":{"type":"string","title":"Ownertag"},"generatedAt":{"type":"string","format":"date-time","title":"Generatedat"}},"type":"object","required":["state","image","serverIds","mcpUrlConfigured","maxPerPlan","maxPersistedPerHost","ownerTag","generatedAt"],"title":"AdminProductOut"},"AdminSessionRowOut":{"properties":{"id":{"type":"string","title":"Id"},"computerId":{"type":"string","title":"Computerid"},"startedAt":{"type":"string","format":"date-time","title":"Startedat"},"lastActionAt":{"type":"string","format":"date-time","title":"Lastactionat"},"endedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Endedat"},"wallSeconds":{"type":"integer","title":"Wallseconds","default":0},"actions":{"type":"integer","title":"Actions","default":0},"screenshots":{"type":"integer","title":"Screenshots","default":0},"bytesOut":{"type":"integer","title":"Bytesout","default":0},"invocationsCharged":{"type":"integer","title":"Invocationscharged","default":1},"endReason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endreason"},"client":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client"},"modelHint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Modelhint"},"graceUntil":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Graceuntil"},"userId":{"type":"string","title":"Userid"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"externalUserId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Externaluserid"},"apiKeyId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Apikeyid"}},"type":"object","required":["id","computerId","startedAt","lastActionAt","userId"],"title":"AdminSessionRowOut"},"AdminTenantRowOut":{"properties":{"userId":{"type":"string","title":"Userid"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"seatPlan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seatplan"},"seatPlanStatus":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seatplanstatus"},"maxMachines":{"type":"integer","title":"Maxmachines"},"maxAwakeMachines":{"type":"integer","title":"Maxawakemachines"},"machines":{"type":"integer","title":"Machines"},"computers":{"type":"integer","title":"Computers"},"openSessions":{"type":"integer","title":"Opensessions"},"lastActionAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastactionat"}},"type":"object","required":["userId","maxMachines","maxAwakeMachines","machines","computers","openSessions"],"title":"AdminTenantRowOut","description":"One tenant that holds a computer, with the seat plan that covers it."},"AdminTotalsOut":{"properties":{"computers":{"type":"integer","title":"Computers"},"byStatus":{"additionalProperties":{"type":"integer"},"type":"object","title":"Bystatus"},"humanMode":{"type":"integer","title":"Humanmode"},"openSessions":{"type":"integer","title":"Opensessions"},"lastDaySessions":{"type":"integer","title":"Lastdaysessions"},"lastDayWallSeconds":{"type":"integer","title":"Lastdaywallseconds"},"lastDayActions":{"type":"integer","title":"Lastdayactions"},"lastDayScreenshots":{"type":"integer","title":"Lastdayscreenshots"},"tenantsEntitled":{"type":"integer","title":"Tenantsentitled"},"tenantsTotal":{"type":"integer","title":"Tenantstotal"},"deletedTotal":{"type":"integer","title":"Deletedtotal"}},"type":"object","required":["computers","byStatus","humanMode","openSessions","lastDaySessions","lastDayWallSeconds","lastDayActions","lastDayScreenshots","tenantsEntitled","tenantsTotal","deletedTotal"],"title":"AdminTotalsOut"},"AgentBillingResponse":{"properties":{"agentId":{"type":"string","title":"Agentid"},"agentName":{"type":"string","title":"Agentname"},"tier":{"type":"string","title":"Tier"},"cost":{"type":"number","title":"Cost"},"invocations":{"type":"integer","title":"Invocations"},"computeMinutes":{"type":"number","title":"Computeminutes"},"computeMinutesThisPeriod":{"type":"number","title":"Computeminutesthisperiod","default":0.0},"invocationsThisPeriod":{"type":"integer","title":"Invocationsthisperiod","default":0},"limitMinutes":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Limitminutes"},"usagePercent":{"type":"number","title":"Usagepercent","default":0.0}},"type":"object","required":["agentId","agentName","tier","cost","invocations","computeMinutes"],"title":"AgentBillingResponse"},"AgentCreate":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"externalId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Externalid"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"},"framework":{"type":"string","title":"Framework","default":"custom"},"tier":{"type":"string","title":"Tier","default":"always_on"},"memMb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Memmb"},"vcpus":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vcpus"},"idleTtlSeconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Idlettlseconds"},"diskGb":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Diskgb"},"computeMinutesLimit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Computeminuteslimit"},"githubRepo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Githubrepo"},"branch":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Branch"},"imageName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imagename"},"templateId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Templateid"},"autoPair":{"type":"boolean","title":"Autopair","default":true},"gatewayPassword":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gatewaypassword"},"serverId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Serverid"},"initialEnvVars":{"items":{"$ref":"#/components/schemas/InitialEnvVar"},"type":"array","title":"Initialenvvars"},"useMaritimeLlm":{"type":"boolean","title":"Usemaritimellm","default":false},"exposedPort":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exposedport"},"healthCheckPath":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Healthcheckpath"},"hasWebUi":{"type":"boolean","title":"Haswebui","default":true},"publicWeb":{"type":"boolean","title":"Publicweb","default":false},"desktop":{"type":"boolean","title":"Desktop","default":false},"uploadS3Key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uploads3Key"},"addOns":{"items":{"type":"string"},"type":"array","title":"Addons"}},"type":"object","required":["name"],"title":"AgentCreate"},"AgentDiagnosticResponse":{"properties":{"source":{"type":"string","title":"Source"},"code":{"type":"string","title":"Code"},"title":{"type":"string","title":"Title"},"message":{"type":"string","title":"Message"},"action":{"type":"string","title":"Action"},"deploymentId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deploymentid"},"technicalDetails":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Technicaldetails"}},"type":"object","required":["source","code","title","message","action"],"title":"AgentDiagnosticResponse"},"AgentResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"},"externalId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Externalid"},"framework":{"type":"string","title":"Framework"},"tier":{"type":"string","title":"Tier"},"status":{"type":"string","title":"Status"},"githubRepo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Githubrepo"},"autoPair":{"type":"boolean","title":"Autopair","default":true},"exposedPort":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exposedport"},"healthCheckPath":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Healthcheckpath"},"hasWebUi":{"type":"boolean","title":"Haswebui","default":true},"templateId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Templateid"},"publicPlay":{"type":"boolean","title":"Publicplay","default":false},"publicWeb":{"type":"boolean","title":"Publicweb","default":false},"publicUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publicurl"},"desktopEnabled":{"type":"boolean","title":"Desktopenabled","default":false},"invocationCount":{"type":"integer","title":"Invocationcount"},"totalComputeSeconds":{"type":"integer","title":"Totalcomputeseconds","default":0},"memMb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Memmb"},"vcpus":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vcpus"},"idleTtlSeconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Idlettlseconds"},"diskMb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Diskmb"},"computeMinutesLimit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Computeminuteslimit"},"sleepPolicy":{"type":"string","title":"Sleeppolicy","default":"auto-sleep"},"lastStartedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Laststartedat"},"lastActiveAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastactiveat"},"derivedImageTag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Derivedimagetag"},"browserbaseConfigured":{"type":"boolean","title":"Browserbaseconfigured","default":false},"projectId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Projectid"},"projectRole":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Projectrole"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"}},"type":"object","required":["id","name","framework","tier","status","invocationCount","createdAt","updatedAt"],"title":"AgentResponse"},"AgentSpendLimitResponse":{"properties":{"monthlyLimitCents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthlylimitcents"},"source":{"type":"string","enum":["agent","account_default","none"],"title":"Source"},"spentThisMonthCents":{"type":"number","title":"Spentthismonthcents"},"limitReached":{"type":"boolean","title":"Limitreached"},"periodStart":{"type":"string","format":"date-time","title":"Periodstart"},"periodEnd":{"type":"string","format":"date-time","title":"Periodend"}},"type":"object","required":["monthlyLimitCents","source","spentThisMonthCents","limitReached","periodStart","periodEnd"],"title":"AgentSpendLimitResponse"},"AgentSpendLimitUpdate":{"properties":{"monthlyLimitCents":{"anyOf":[{"type":"integer","maximum":1000000.0,"minimum":0.0},{"type":"null"}],"title":"Monthlylimitcents"}},"type":"object","required":["monthlyLimitCents"],"title":"AgentSpendLimitUpdate"},"AgentUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"},"framework":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Framework"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"githubRepo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Githubrepo"},"autoPair":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Autopair"},"exposedPort":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exposedport"},"healthCheckPath":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Healthcheckpath"},"hasWebUi":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Haswebui"},"publicPlay":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Publicplay"}},"type":"object","title":"AgentUpdate"},"AgentUsage":{"properties":{"agentId":{"type":"string","title":"Agentid"},"agentName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agentname"},"externalUserId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Externaluserid"},"projectId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Projectid"},"computeMinutes":{"type":"number","title":"Computeminutes"},"hostingCostCents":{"type":"integer","title":"Hostingcostcents"},"slotCostCents":{"type":"integer","title":"Slotcostcents","default":0},"addOnCostCents":{"type":"integer","title":"Addoncostcents","default":0},"llmCostCents":{"type":"number","title":"Llmcostcents"},"totalCostCents":{"type":"number","title":"Totalcostcents"}},"type":"object","required":["agentId","computeMinutes","hostingCostCents","llmCostCents","totalCostCents"],"title":"AgentUsage"},"ApiCreditsRequest":{"properties":{"amount_cents":{"type":"integer","minimum":500.0,"title":"Amount Cents","description":"AI credits to buy, in cents, minimum $5 (500)"}},"type":"object","required":["amount_cents"],"title":"ApiCreditsRequest"},"ApiKeyCreate":{"properties":{"name":{"type":"string","title":"Name","description":"Human-readable name for this key"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes","description":"Scopes: provision (create), deploy (lifecycle/chat), secrets (env vars), manage (delete + everything, wildcard). Defaults to full access; pass a narrower set to restrict a key.","default":["provision","deploy","secrets","manage"]},"expires_in_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires In Days","description":"Key expiry in days from now. Null = never expires"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id","description":"Restrict this key to one project (plan 22 §3). Scoped keys only work on the /api/v1 partner surface (front door, usage) for that project; every other endpoint rejects them."}},"type":"object","required":["name"],"title":"ApiKeyCreate"},"ApiKeyCreated":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"is_active":{"type":"boolean","title":"Is Active"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"raw_key":{"type":"string","title":"Raw Key","description":"Full API key. Store securely, shown only once"}},"type":"object","required":["id","name","key_prefix","scopes","is_active","last_used_at","expires_at","created_at","raw_key"],"title":"ApiKeyCreated","description":"Returned only on creation. Includes the raw key (shown once)."},"ApiKeyResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"is_active":{"type":"boolean","title":"Is Active"},"project_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Id"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","key_prefix","scopes","is_active","last_used_at","expires_at","created_at"],"title":"ApiKeyResponse"},"AutoRechargeConfig":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"thresholdCents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Thresholdcents"},"amountCents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Amountcents"}},"type":"object","required":["enabled"],"title":"AutoRechargeConfig"},"BanRequest":{"properties":{"user_id":{"type":"string","minLength":1,"title":"User Id"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"block_ips":{"type":"boolean","title":"Block Ips","default":false},"delete_agents":{"type":"boolean","title":"Delete Agents","default":false}},"type":"object","required":["user_id"],"title":"BanRequest"},"BaseAgentRef":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"BaseAgentRef","description":"The product an end user's agent was stamped from: the base agent of its project."},"BatchRequest":{"properties":{"actions":{"items":{"$ref":"#/components/schemas/ActionRequest"},"type":"array","maxItems":50,"minItems":1,"title":"Actions"},"format":{"anyOf":[{"type":"string","enum":["png","jpeg"]},{"type":"null"}],"title":"Format"},"quality":{"anyOf":[{"type":"integer","maximum":95.0,"minimum":1.0},{"type":"null"}],"title":"Quality"}},"type":"object","required":["actions"],"title":"BatchRequest"},"BatchResult":{"properties":{"results":{"items":{"$ref":"#/components/schemas/ActionResult"},"type":"array","title":"Results"}},"type":"object","required":["results"],"title":"BatchResult"},"BillingConfigResponse":{"properties":{"v2Enabled":{"type":"boolean","title":"V2Enabled"},"agentFeeCentsPerMonth":{"type":"integer","title":"Agentfeecentspermonth"},"maxConcurrentActive":{"type":"integer","title":"Maxconcurrentactive"},"bundles":{"additionalProperties":{"$ref":"#/components/schemas/CreditBundleSpec"},"type":"object","title":"Bundles"}},"type":"object","required":["v2Enabled","agentFeeCentsPerMonth","maxConcurrentActive","bundles"],"title":"BillingConfigResponse","description":"Live pricing configuration (plan 20). `v2_enabled` gates the new\nwallet-first UI: when False the frontend renders the legacy UI."},"BillingInfoResponse":{"properties":{"totalAgents":{"type":"integer","title":"Totalagents"},"totalCost":{"type":"number","title":"Totalcost"},"computeMinutes":{"type":"number","title":"Computeminutes"},"agents":{"items":{"$ref":"#/components/schemas/AgentBillingResponse"},"type":"array","title":"Agents"},"billingPeriod":{"type":"string","title":"Billingperiod","default":""}},"type":"object","required":["totalAgents","totalCost","computeMinutes","agents"],"title":"BillingInfoResponse"},"Body_exchange_token_api_plugin_oauth_token_post":{"properties":{"grant_type":{"type":"string","title":"Grant Type"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"redirect_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Uri"},"code_verifier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Verifier"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"resource":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource"}},"type":"object","required":["grant_type"],"title":"Body_exchange_token_api_plugin_oauth_token_post"},"Body_revoke_token_api_plugin_oauth_revoke_post":{"properties":{"token":{"type":"string","title":"Token"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}},"type":"object","required":["token"],"title":"Body_revoke_token_api_plugin_oauth_revoke_post"},"Body_upload_agent_file_api_agents__agent_id__files_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"dest_dir":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dest Dir"}},"type":"object","required":["file"],"title":"Body_upload_agent_file_api_agents__agent_id__files_upload_post"},"Body_upload_zip_api_upload_zip_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_zip_api_upload_zip_post"},"CancelBody":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"}},"type":"object","title":"CancelBody"},"CapabilityRequest":{"properties":{"capability":{"type":"string","enum":["identity","browser"],"title":"Capability"},"action":{"type":"string","enum":["add","remove"],"title":"Action"}},"type":"object","required":["capability","action"],"title":"CapabilityRequest"},"CapturePage":{"properties":{"captures":{"items":{"$ref":"#/components/schemas/CaptureRow"},"type":"array","title":"Captures"},"nextBefore":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Nextbefore"}},"type":"object","required":["captures","nextBefore"],"title":"CapturePage"},"CaptureRow":{"properties":{"id":{"type":"string","title":"Id"},"userId":{"type":"string","title":"Userid"},"agentId":{"type":"string","title":"Agentid"},"statusCode":{"type":"integer","title":"Statuscode"},"storedBytes":{"type":"integer","title":"Storedbytes"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"}},"type":"object","required":["id","userId","agentId","statusCode","storedBytes","createdAt"],"title":"CaptureRow"},"ChannelConfig":{"properties":{"channels":{"additionalProperties":true,"type":"object","title":"Channels"},"auto_start":{"type":"boolean","title":"Auto Start","default":false}},"type":"object","required":["channels"],"title":"ChannelConfig"},"ChatRequest":{"properties":{"message":{"type":"string","title":"Message"},"conversation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversation Id"}},"type":"object","required":["message"],"title":"ChatRequest"},"ClaimAcceptedResponse":{"properties":{"ok":{"type":"boolean","title":"Ok","default":true},"agentId":{"type":"string","title":"Agentid"},"agentName":{"type":"string","title":"Agentname"},"renamed":{"type":"boolean","title":"Renamed"}},"type":"object","required":["agentId","agentName","renamed"],"title":"ClaimAcceptedResponse","description":"The outcome of an accepted claim."},"ClaimPreviewResponse":{"properties":{"agentName":{"type":"string","title":"Agentname"},"framework":{"type":"string","title":"Framework"},"status":{"type":"string","title":"Status"},"expiresAt":{"type":"string","title":"Expiresat"},"claimed":{"type":"boolean","title":"Claimed","default":false}},"type":"object","required":["agentName","framework","status","expiresAt"],"title":"ClaimPreviewResponse","description":"What the claim page shows."},"CliAuthResponse":{"properties":{"token":{"type":"string","title":"Token"},"user":{"$ref":"#/components/schemas/UserResponse"}},"type":"object","required":["token","user"],"title":"CliAuthResponse","description":"Response schema for CLI auth flows."},"ComputerCreateRequest":{"properties":{"externalUserId":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Externaluserid"},"name":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Name"},"os":{"type":"string","enum":["linux","windows","android"],"title":"Os","default":"linux"},"arch":{"type":"string","enum":["x86_64","arm64"],"title":"Arch","default":"x86_64"}},"type":"object","title":"ComputerCreateRequest"},"ComputerListOut":{"properties":{"computers":{"items":{"$ref":"#/components/schemas/ComputerOut"},"type":"array","title":"Computers"}},"type":"object","required":["computers"],"title":"ComputerListOut"},"ComputerOut":{"properties":{"id":{"type":"string","title":"Id"},"os":{"type":"string","enum":["linux","windows","android"],"title":"Os","default":"linux"},"arch":{"type":"string","enum":["x86_64","arm64"],"title":"Arch","default":"x86_64"},"externalUserId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Externaluserid"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"status":{"type":"string","title":"Status"},"screen":{"$ref":"#/components/schemas/ScreenOut"},"mode":{"type":"string","title":"Mode"},"modeReason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Modereason"},"takeoverSeq":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Takeoverseq"},"takeoverExpiresAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Takeoverexpiresat"},"lastTakeoverResult":{"anyOf":[{"type":"string","enum":["success","failed","expired"]},{"type":"null"}],"title":"Lasttakeoverresult"},"lastTakeoverNote":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lasttakeovernote"},"lastActionAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastactionat"},"lastWakeMs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lastwakems"},"lastWakeMethod":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastwakemethod"},"errorMessage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Errormessage"},"session":{"anyOf":[{"$ref":"#/components/schemas/SessionSummaryOut"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","title":"Createdat"}},"type":"object","required":["id","status","screen","mode","createdAt"],"title":"ComputerOut"},"ComputerUsageOut":{"properties":{"computerId":{"type":"string","title":"Computerid"},"externalUserId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Externaluserid"},"invocations":{"type":"integer","title":"Invocations","default":0},"wallSeconds":{"type":"integer","title":"Wallseconds","default":0},"actions":{"type":"integer","title":"Actions","default":0},"screenshots":{"type":"integer","title":"Screenshots","default":0}},"type":"object","required":["computerId"],"title":"ComputerUsageOut"},"ConnectTelegramRequest":{"properties":{"botToken":{"type":"string","title":"Bottoken"}},"type":"object","required":["botToken"],"title":"ConnectTelegramRequest"},"ConsentRequest":{"properties":{"client_id":{"type":"string","title":"Client Id"},"redirect_uri":{"type":"string","title":"Redirect Uri"},"response_type":{"type":"string","title":"Response Type"},"code_challenge":{"type":"string","title":"Code Challenge"},"code_challenge_method":{"type":"string","title":"Code Challenge Method"},"state":{"type":"string","title":"State"},"resource":{"type":"string","title":"Resource"},"scope":{"type":"string","title":"Scope"},"approved":{"type":"boolean","title":"Approved"}},"type":"object","required":["client_id","redirect_uri","response_type","code_challenge","code_challenge_method","state","resource","scope","approved"],"title":"ConsentRequest","description":"Carries a browser consent choice and its OAuth request parameters."},"ContactRequest":{"properties":{"name":{"type":"string","title":"Name"},"email":{"type":"string","title":"Email"},"message":{"type":"string","title":"Message"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"answers":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Answers"},"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"}},"type":"object","required":["name","email","message"],"title":"ContactRequest"},"CreateClaimCodesRequest":{"properties":{"count":{"type":"integer","title":"Count","default":1},"targetAgentId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Targetagentid"},"expiresInHours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expiresinhours"}},"type":"object","title":"CreateClaimCodesRequest"},"CreditBundleSpec":{"properties":{"priceCents":{"type":"integer","title":"Pricecents"},"creditCents":{"type":"integer","title":"Creditcents"},"concurrent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Concurrent"}},"type":"object","required":["priceCents","creditCents"],"title":"CreditBundleSpec"},"CustomerPortalResponse":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"CustomerPortalResponse","description":"Response containing Stripe Customer Portal URL."},"DailyUsageReport":{"properties":{"periodStart":{"type":"string","format":"date-time","title":"Periodstart"},"periodEnd":{"type":"string","format":"date-time","title":"Periodend"},"hostingBasis":{"type":"string","title":"Hostingbasis","default":"metered"},"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"},"days":{"items":{"$ref":"#/components/schemas/DayUsage"},"type":"array","title":"Days"}},"type":"object","required":["periodStart","periodEnd","days"],"title":"DailyUsageReport"},"DashboardComputerCreateRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Name"},"os":{"type":"string","enum":["linux","windows","android"],"title":"Os","default":"linux"},"arch":{"type":"string","enum":["x86_64","arm64"],"title":"Arch","default":"x86_64"}},"type":"object","title":"DashboardComputerCreateRequest","description":"A computer that a signed-in person creates from the dashboard."},"DayUsage":{"properties":{"day":{"type":"string","format":"date","title":"Day"},"computeMinutes":{"type":"number","title":"Computeminutes"},"hostingCostCents":{"type":"integer","title":"Hostingcostcents"},"llmCostCents":{"type":"number","title":"Llmcostcents"},"totalCostCents":{"type":"number","title":"Totalcostcents"}},"type":"object","required":["day","computeMinutes","hostingCostCents","llmCostCents","totalCostCents"],"title":"DayUsage"},"DeployCreate":{"properties":{"agentId":{"type":"string","title":"Agentid"},"source":{"type":"string","enum":["github","docker","template","zip"],"title":"Source","default":"github"},"repoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Repourl"},"imageName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imagename"},"branch":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Branch"},"uploadS3Key":{"anyOf":[{"type":"string","pattern":"^uploads/[^/\\s]+/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\\.tar\\.gz$"},{"type":"null"}],"title":"Uploads3Key"}},"type":"object","required":["agentId"],"title":"DeployCreate"},"DeploymentListResponse":{"properties":{"id":{"type":"string","title":"Id"},"agentId":{"type":"string","title":"Agentid"},"agentName":{"type":"string","title":"Agentname"},"framework":{"type":"string","title":"Framework"},"status":{"type":"string","title":"Status"},"commitSha":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commitsha"},"startedAt":{"type":"string","format":"date-time","title":"Startedat"},"completedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completedat"}},"type":"object","required":["id","agentId","agentName","framework","status","startedAt"],"title":"DeploymentListResponse"},"DeploymentResponse":{"properties":{"id":{"type":"string","title":"Id"},"agentId":{"type":"string","title":"Agentid"},"status":{"type":"string","title":"Status"},"commitSha":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commitsha"},"buildLog":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Buildlog"},"startedAt":{"type":"string","format":"date-time","title":"Startedat"},"completedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completedat"},"errorCode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Errorcode"},"errorTitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Errortitle"},"errorMessage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Errormessage"},"errorAction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Erroraction"}},"type":"object","required":["id","agentId","status","startedAt"],"title":"DeploymentResponse"},"DesktopConfigRequest":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"DesktopConfigRequest"},"DeviceCodeRequest":{"properties":{"client":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},"type":"object","title":"DeviceCodeRequest","description":"Request schema for starting a device-code login. Both fields are logged only."},"DeviceCodeResponse":{"properties":{"device_code":{"type":"string","title":"Device Code"},"user_code":{"type":"string","title":"User Code"},"verification_uri":{"type":"string","title":"Verification Uri"},"verification_uri_complete":{"type":"string","title":"Verification Uri Complete"},"expires_in":{"type":"integer","title":"Expires In"},"interval":{"type":"integer","title":"Interval"}},"type":"object","required":["device_code","user_code","verification_uri","verification_uri_complete","expires_in","interval"],"title":"DeviceCodeResponse","description":"Response schema for a freshly issued device code (RFC 8628 field names)."},"DeviceDecisionResponse":{"properties":{"ok":{"type":"boolean","title":"Ok"}},"type":"object","required":["ok"],"title":"DeviceDecisionResponse","description":"Response schema for an approve or deny call."},"DeviceTokenRequest":{"properties":{"device_code":{"type":"string","title":"Device Code"}},"type":"object","required":["device_code"],"title":"DeviceTokenRequest","description":"Request schema for the terminal polling for its token."},"DeviceUserCodeRequest":{"properties":{"user_code":{"type":"string","title":"User Code"}},"type":"object","required":["user_code"],"title":"DeviceUserCodeRequest","description":"Request schema for the signed-in human approving or denying a user code."},"DuplicateAgentRequest":{"properties":{"count":{"type":"integer","title":"Count","default":1},"namePrefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nameprefix"}},"type":"object","title":"DuplicateAgentRequest"},"DuplicateAgentResponse":{"properties":{"projectId":{"type":"string","title":"Projectid"},"created":{"items":{"$ref":"#/components/schemas/AgentResponse"},"type":"array","title":"Created"}},"type":"object","required":["projectId","created"],"title":"DuplicateAgentResponse"},"EffectPhase":{"type":"string","enum":["accepted","host_accepted","stopped","settings_applied","boot_observed","running_observed"],"title":"EffectPhase","description":"Identifies the last independently confirmed effect."},"EndUserActivity":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EndUserActivityItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"EndUserActivity","description":"An end user's most recent activity, newest first."},"EndUserActivityItem":{"properties":{"kind":{"type":"string","title":"Kind"},"at":{"type":"string","format":"date-time","title":"At"},"agentId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agentid"},"agentName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agentname"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"reply":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply"},"replies":{"items":{"type":"string"},"type":"array","title":"Replies"},"images":{"items":{"type":"string"},"type":"array","title":"Images"},"repliedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Repliedat"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"computeSeconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Computeseconds"},"scheduled":{"type":"boolean","title":"Scheduled","default":false},"scheduleLabel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedulelabel"}},"type":"object","required":["kind","at"],"title":"EndUserActivityItem","description":"One line of an end user's timeline."},"EndUserAgentCreate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"externalId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Externalid"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"},"framework":{"type":"string","title":"Framework","default":"custom"},"tier":{"type":"string","title":"Tier","default":"always_on"},"memMb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Memmb"},"vcpus":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Vcpus"},"idleTtlSeconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Idlettlseconds"},"diskGb":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Diskgb"},"computeMinutesLimit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Computeminuteslimit"},"githubRepo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Githubrepo"},"branch":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Branch"},"imageName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imagename"},"templateId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Templateid"},"autoPair":{"type":"boolean","title":"Autopair","default":true},"gatewayPassword":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gatewaypassword"},"serverId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Serverid"},"initialEnvVars":{"items":{"$ref":"#/components/schemas/InitialEnvVar"},"type":"array","title":"Initialenvvars"},"useMaritimeLlm":{"type":"boolean","title":"Usemaritimellm","default":false},"exposedPort":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exposedport"},"healthCheckPath":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Healthcheckpath"},"hasWebUi":{"type":"boolean","title":"Haswebui","default":true},"publicWeb":{"type":"boolean","title":"Publicweb","default":false},"desktop":{"type":"boolean","title":"Desktop","default":false},"uploadS3Key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uploads3Key"},"addOns":{"items":{"type":"string"},"type":"array","title":"Addons"}},"type":"object","title":"EndUserAgentCreate","description":"Body of ``POST /api/v1/end-users/{external_id}/agents``.\n\nThe same fields as an agent create. ``name`` may be left out; the end\nuser's external id then names the agent. ``externalId`` is ignored: the\npath names the end user."},"EndUserAgentSummary":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status"},"framework":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Framework"},"templateId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Templateid"},"projectId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Projectid"},"projectRole":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Projectrole"},"baseAgent":{"anyOf":[{"$ref":"#/components/schemas/BaseAgentRef"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"lastActiveAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastactiveat"}},"type":"object","required":["id","name","status","createdAt"],"title":"EndUserAgentSummary","description":"One agent of an end user, as listed on the end user."},"EndUserDetail":{"properties":{"id":{"type":"string","title":"Id"},"externalId":{"type":"string","title":"Externalid"},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayname"},"metadata":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}]},"type":"object","title":"Metadata"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"status":{"type":"string","title":"Status"},"policy":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"}]},"type":"object"},{"type":"null"}],"title":"Policy"},"agentCount":{"type":"integer","title":"Agentcount","default":0},"agents":{"items":{"$ref":"#/components/schemas/EndUserAgentSummary"},"type":"array","title":"Agents"},"aiSpendCents30d":{"type":"number","title":"Aispendcents30D","default":0},"messageCount":{"type":"integer","title":"Messagecount","default":0},"lastMessage":{"anyOf":[{"$ref":"#/components/schemas/EndUserLastMessage"},{"type":"null"}]},"activity14d":{"items":{"type":"integer"},"type":"array","title":"Activity14D"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"},"lastActiveAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastactiveat"},"liveTokenCount":{"type":"integer","title":"Livetokencount","default":0}},"type":"object","required":["id","externalId","status","createdAt","updatedAt"],"title":"EndUserDetail","description":"One end user with its agents and access rollups."},"EndUserLastMessage":{"properties":{"at":{"type":"string","format":"date-time","title":"At"},"fromAgent":{"type":"boolean","title":"Fromagent"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"imageCount":{"type":"integer","title":"Imagecount","default":0},"failed":{"type":"boolean","title":"Failed","default":false}},"type":"object","required":["at","fromAgent"],"title":"EndUserLastMessage","description":"The last thing said between the end user and their agent."},"EndUserList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EndUserResponse"},"type":"array","title":"Items"},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextcursor"}},"type":"object","required":["items"],"title":"EndUserList","description":"One page of end users."},"EndUserPolicyBody":{"properties":{"policy":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"},{"type":"null"}]},"type":"object","title":"Policy"}},"type":"object","required":["policy"],"title":"EndUserPolicyBody","description":"Body of ``PUT /api/v1/end-users/{external_id}/policy``: the whole policy."},"EndUserPolicyResponse":{"properties":{"policy":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"}]},"type":"object"},{"type":"null"}],"title":"Policy"},"appliedToAgents":{"type":"integer","title":"Appliedtoagents","default":0}},"type":"object","title":"EndUserPolicyResponse","description":"The policy after a change and how many agents it was applied to."},"EndUserResponse":{"properties":{"id":{"type":"string","title":"Id"},"externalId":{"type":"string","title":"Externalid"},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayname"},"metadata":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}]},"type":"object","title":"Metadata"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"status":{"type":"string","title":"Status"},"policy":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"integer"}]},"type":"object"},{"type":"null"}],"title":"Policy"},"agentCount":{"type":"integer","title":"Agentcount","default":0},"agents":{"items":{"$ref":"#/components/schemas/EndUserAgentSummary"},"type":"array","title":"Agents"},"aiSpendCents30d":{"type":"number","title":"Aispendcents30D","default":0},"messageCount":{"type":"integer","title":"Messagecount","default":0},"lastMessage":{"anyOf":[{"$ref":"#/components/schemas/EndUserLastMessage"},{"type":"null"}]},"activity14d":{"items":{"type":"integer"},"type":"array","title":"Activity14D"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"},"lastActiveAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastactiveat"}},"type":"object","required":["id","externalId","status","createdAt","updatedAt"],"title":"EndUserResponse","description":"One end user with its rollups."},"EndUserSummary":{"properties":{"totalUsers":{"type":"integer","title":"Totalusers"},"activeUsers7d":{"type":"integer","title":"Activeusers7D"},"neverMessaged":{"type":"integer","title":"Nevermessaged"},"messages":{"type":"integer","title":"Messages"},"days":{"items":{"$ref":"#/components/schemas/EndUserSummaryDay"},"type":"array","title":"Days"}},"type":"object","required":["totalUsers","activeUsers7d","neverMessaged","messages","days"],"title":"EndUserSummary","description":"The account's users now and per day, oldest day first."},"EndUserSummaryDay":{"properties":{"day":{"type":"string","format":"date","title":"Day"},"users":{"type":"integer","title":"Users"},"newUsers":{"type":"integer","title":"Newusers"},"activeUsers":{"type":"integer","title":"Activeusers"},"messages":{"type":"integer","title":"Messages"}},"type":"object","required":["day","users","newUsers","activeUsers","messages"],"title":"EndUserSummaryDay","description":"One UTC day of the account's users."},"EndUserTokenRequest":{"properties":{"agentId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agentid"},"scopes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Scopes"},"ttlSeconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ttlseconds"}},"type":"object","title":"EndUserTokenRequest","description":"Body of ``POST /api/v1/end-users/{external_id}/tokens``."},"EndUserTokenResponse":{"properties":{"token":{"type":"string","title":"Token"},"agentId":{"type":"string","title":"Agentid"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"},"expiresAt":{"type":"string","format":"date-time","title":"Expiresat"}},"type":"object","required":["token","agentId","scopes","expiresAt"],"title":"EndUserTokenResponse","description":"A minted token. ``token`` is shown once."},"EndUserUpsert":{"properties":{"displayName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayname"},"metadata":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Metadata"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"}},"type":"object","title":"EndUserUpsert","description":"Body of ``PUT /api/v1/end-users/{external_id}``. Absent fields are kept."},"EntryCreate":{"properties":{"kind":{"type":"string","title":"Kind"},"value":{"type":"string","title":"Value"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["kind","value"],"title":"EntryCreate"},"EnvVarCreate":{"properties":{"key":{"type":"string","maxLength":256,"minLength":1,"title":"Key"},"value":{"type":"string","title":"Value"},"isSecret":{"type":"boolean","title":"Issecret","default":false}},"type":"object","required":["key","value"],"title":"EnvVarCreate","description":"Request body for POST /api/agents/{agent_id}/env.\n\nThe route checks ENV_KEY_PATTERN itself, because a key that already\nexists may predate the rule and must stay editable."},"EnvVarResponse":{"properties":{"id":{"type":"string","title":"Id"},"agentId":{"type":"string","title":"Agentid"},"key":{"type":"string","title":"Key"},"value":{"type":"string","title":"Value"},"isSecret":{"type":"boolean","title":"Issecret"},"warning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Warning"}},"type":"object","required":["id","agentId","key","value","isSecret"],"title":"EnvVarResponse"},"ErrorBody":{"properties":{"error":{"type":"string","title":"Error"},"message":{"type":"string","title":"Message"},"retryAfterS":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retryafters"}},"type":"object","required":["error","message"],"title":"ErrorBody","description":"The /api/v1/computers error shape (plan 34a §10)."},"ExecOut":{"properties":{"exitCode":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exitcode"},"stdout":{"type":"string","title":"Stdout","default":""},"stderr":{"type":"string","title":"Stderr","default":""}},"type":"object","title":"ExecOut"},"ExecRequest":{"properties":{"command":{"type":"string","maxLength":8192,"minLength":1,"title":"Command"},"timeoutS":{"type":"integer","maximum":30.0,"minimum":1.0,"title":"Timeouts","default":30}},"type":"object","required":["command"],"title":"ExecRequest"},"FailureCode":{"type":"string","enum":["disabled","unqualified","unsupported","missing_state","device_mismatch","writer_conflict","observation_unavailable","ownership_changed","deadline","host_unavailable","configuration_failed","interrupted"],"title":"FailureCode","description":"Contains safe failure codes without secret-bearing diagnostics."},"FeedbackCreate":{"properties":{"message":{"type":"string","maxLength":5000,"minLength":1,"title":"Message","description":"What went wrong, in plain words. Include what you expected."},"kind":{"type":"string","title":"Kind","description":"What the report is about: one of ['api', 'cli', 'computers', 'dashboard', 'docs', 'other', 'sdk'].","default":"other"},"subject":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Subject","description":"The page URL, endpoint, SDK method or CLI command the report concerns."},"agentId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agentid","description":"The Maritime agent the report is about, when there is one."},"requestId":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Requestid","description":"The X-Request-Id of the failing call, when the report is about one."},"statusCode":{"anyOf":[{"type":"integer","maximum":599.0,"minimum":100.0},{"type":"null"}],"title":"Statuscode","description":"HTTP status of the failing call, when the report is about one."},"tool":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Tool","description":"Who is sending, e.g. \"claude-code/2.1.0\" or \"codex\"."},"context":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Context","description":"Up to 20 flat key/value pairs (SDK version, OS, ...). Never put secrets or env values here."}},"type":"object","required":["message"],"title":"FeedbackCreate"},"FeedbackResponse":{"properties":{"id":{"type":"string","title":"Id"},"kind":{"type":"string","title":"Kind"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"message":{"type":"string","title":"Message"},"agentId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agentid"},"requestId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requestid"},"statusCode":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Statuscode"},"tool":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"}},"type":"object","required":["id","kind","subject","message","agentId","requestId","statusCode","tool","createdAt"],"title":"FeedbackResponse"},"FileEntry":{"properties":{"name":{"type":"string","title":"Name"},"size":{"type":"integer","title":"Size"},"isDir":{"type":"boolean","title":"Isdir"},"mtime":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Mtime"}},"type":"object","required":["name","size","isDir"],"title":"FileEntry"},"FileListOut":{"properties":{"path":{"type":"string","title":"Path"},"entries":{"items":{"$ref":"#/components/schemas/FileEntry"},"type":"array","title":"Entries"}},"type":"object","required":["path","entries"],"title":"FileListOut"},"FleetBatchRequest":{"properties":{"namePrefix":{"type":"string","title":"Nameprefix"},"count":{"type":"integer","title":"Count"},"templateId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Templateid"},"framework":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Framework"},"githubRepo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Githubrepo"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"idleTtlSeconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Idlettlseconds","default":3600},"envVars":{"items":{"$ref":"#/components/schemas/InitialEnvVar"},"type":"array","title":"Envvars"}},"type":"object","required":["namePrefix","count"],"title":"FleetBatchRequest"},"FleetPropagateRequest":{"properties":{"path":{"type":"string","title":"Path"},"content":{"type":"string","title":"Content"},"agentIds":{"items":{"type":"string"},"type":"array","title":"Agentids"},"restart":{"type":"boolean","title":"Restart","default":true}},"type":"object","required":["path","content","agentIds"],"title":"FleetPropagateRequest"},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest","description":"Request schema for initiating a password reset."},"FrontDoorUser":{"properties":{"externalUserId":{"type":"string","title":"Externaluserid"},"agentId":{"type":"string","title":"Agentid"},"agentStatus":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agentstatus"},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayname"},"messageCount":{"type":"integer","title":"Messagecount"},"lastActiveAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastactiveat"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"}},"type":"object","required":["externalUserId","agentId","messageCount","createdAt"],"title":"FrontDoorUser"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InitialEnvVar":{"properties":{"key":{"type":"string","title":"Key"},"value":{"type":"string","title":"Value"},"isSecret":{"type":"boolean","title":"Issecret","default":true}},"type":"object","required":["key","value"],"title":"InitialEnvVar"},"InviteAcceptedResponse":{"properties":{"organization":{"$ref":"#/components/schemas/OrganizationResponse"}},"type":"object","required":["organization"],"title":"InviteAcceptedResponse"},"InviteCreate":{"properties":{"email":{"type":"string","maxLength":320,"minLength":3,"title":"Email"},"role":{"type":"string","title":"Role","default":"member"}},"type":"object","required":["email"],"title":"InviteCreate"},"InvitePreviewResponse":{"properties":{"organizationId":{"type":"string","title":"Organizationid"},"organizationName":{"type":"string","title":"Organizationname"},"inviterName":{"type":"string","title":"Invitername"},"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role"},"expiresAt":{"type":"string","format":"date-time","title":"Expiresat"}},"type":"object","required":["organizationId","organizationName","inviterName","email","role","expiresAt"],"title":"InvitePreviewResponse"},"InviteResponse":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role"},"invitedBy":{"type":"string","title":"Invitedby"},"invitedByName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invitedbyname"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"expiresAt":{"type":"string","format":"date-time","title":"Expiresat"},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link"}},"type":"object","required":["id","email","role","invitedBy","createdAt","expiresAt"],"title":"InviteResponse"},"InvoiceResponse":{"properties":{"id":{"type":"string","title":"Id"},"stripeInvoiceId":{"type":"string","title":"Stripeinvoiceid"},"product":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product"},"amountPaid":{"type":"integer","title":"Amountpaid"},"currency":{"type":"string","title":"Currency"},"status":{"type":"string","title":"Status"},"invoicePdfUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoicepdfurl"},"billingPeriodStart":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Billingperiodstart"},"billingPeriodEnd":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Billingperiodend"},"paidAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paidat"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"}},"type":"object","required":["id","stripeInvoiceId","amountPaid","currency","status","createdAt"],"title":"InvoiceResponse","description":"Invoice details with PDF link.\n\n``product`` names what the invoice billed: ``agents`` (the seat plan),\n``computers``, ``ai_credits``, ``credits`` (legacy bundles) or None when\nunknown."},"LiveViewResponse":{"properties":{"liveViewUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Liveviewurl"},"sessionId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sessionid"},"startedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Startedat"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"LiveViewResponse"},"LlmCall":{"properties":{"id":{"type":"string","title":"Id"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"model":{"type":"string","title":"Model"},"promptTokens":{"type":"integer","title":"Prompttokens"},"cachedTokens":{"type":"integer","title":"Cachedtokens"},"completionTokens":{"type":"integer","title":"Completiontokens"},"reasoningTokens":{"type":"integer","title":"Reasoningtokens"},"costCents":{"type":"number","title":"Costcents"},"upstreamRequestId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upstreamrequestid"}},"type":"object","required":["id","timestamp","model","promptTokens","cachedTokens","completionTokens","reasoningTokens","costCents","upstreamRequestId"],"title":"LlmCall"},"LlmCallPage":{"properties":{"calls":{"items":{"$ref":"#/components/schemas/LlmCall"},"type":"array","title":"Calls"},"nextBefore":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Nextbefore"}},"type":"object","required":["calls","nextBefore"],"title":"LlmCallPage"},"LogEntryResponse":{"properties":{"id":{"type":"string","title":"Id"},"agentId":{"type":"string","title":"Agentid"},"level":{"type":"string","title":"Level"},"message":{"type":"string","title":"Message"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"source":{"type":"string","title":"Source"}},"type":"object","required":["id","agentId","level","message","timestamp","source"],"title":"LogEntryResponse"},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest","description":"Request schema for credential validation."},"McpStatusOut":{"properties":{"connected":{"type":"boolean","title":"Connected","default":false},"lastCallAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastcallat"},"lastClient":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastclient"},"openSessions":{"type":"integer","title":"Opensessions","default":0},"totalSessions":{"type":"integer","title":"Totalsessions","default":0}},"type":"object","title":"McpStatusOut","description":"Whether a model has actually reached Computers, for the dashboard.\n\nDerived from the account's session rows: ``last_call_at`` is the newest\n``last_action_at``, ``last_client`` the ``client`` hint of that session,\n``open_sessions`` the count with ``ended_at IS NULL``, and\n``total_sessions`` the lifetime count. ``connected`` is ``last_call_at\nis not None``: the key has been used at least once."},"MeResponse":{"properties":{"userId":{"type":"string","title":"Userid"},"enabled":{"type":"boolean","title":"Enabled"},"organization":{"anyOf":[{"$ref":"#/components/schemas/OrganizationResponse"},{"type":"null"}]},"own":{"anyOf":[{"$ref":"#/components/schemas/OrganizationResponse"},{"type":"null"}]},"memberships":{"items":{"$ref":"#/components/schemas/OrganizationResponse"},"type":"array","title":"Memberships"}},"type":"object","required":["userId","enabled","memberships"],"title":"MeResponse"},"MemberResponse":{"properties":{"userId":{"type":"string","title":"Userid"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"role":{"type":"string","title":"Role"},"joinedAt":{"type":"string","format":"date-time","title":"Joinedat"}},"type":"object","required":["userId","role","joinedAt"],"title":"MemberResponse"},"MemberRoleUpdate":{"properties":{"role":{"type":"string","title":"Role"}},"type":"object","required":["role"],"title":"MemberRoleUpdate"},"MessageSend":{"properties":{"externalUserId":{"type":"string","title":"Externaluserid","description":"The caller's own end-user id (opaque to Maritime)"},"message":{"type":"string","title":"Message"},"wait":{"type":"integer","maximum":60.0,"minimum":0.0,"title":"Wait","description":"Seconds to wait for the reply inline; 0 = ack immediately","default":30},"claimCode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Claimcode","description":"Claim code, for projects with new_chat_policy=claim"},"displayName":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Displayname"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata","description":"Opaque passthrough, echoed on reads and reply webhooks"}},"type":"object","required":["externalUserId","message"],"title":"MessageSend"},"MessageState":{"properties":{"messageId":{"type":"string","title":"Messageid"},"externalUserId":{"type":"string","title":"Externaluserid"},"agentId":{"type":"string","title":"Agentid"},"status":{"type":"string","title":"Status"},"reply":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"userCreated":{"type":"boolean","title":"Usercreated","default":false},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"repliedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Repliedat"}},"type":"object","required":["messageId","externalUserId","agentId","status","createdAt"],"title":"MessageState"},"OperationState":{"type":"string","enum":["accepted","running","completed","failed","unresolved"],"title":"OperationState","description":"Identifies durable progress independently from confirmed effects."},"OrganizationCreate":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"OrganizationCreate"},"OrganizationResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"role":{"type":"string","title":"Role"}},"type":"object","required":["id","name","role"],"title":"OrganizationResponse"},"OrganizationUpdate":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"OrganizationUpdate"},"PaymentMethodResponse":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","title":"Type"},"cardBrand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cardbrand"},"cardLast4":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cardlast4"},"cardExpMonth":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cardexpmonth"},"cardExpYear":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cardexpyear"},"isDefault":{"type":"boolean","title":"Isdefault"}},"type":"object","required":["id","type","isDefault"],"title":"PaymentMethodResponse","description":"Payment method display metadata."},"PlanStatusOut":{"properties":{"seatPlan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seatplan"},"seatPlanStatus":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Seatplanstatus"},"machines":{"type":"integer","title":"Machines","default":0},"computers":{"type":"integer","title":"Computers","default":0},"maxMachines":{"type":"integer","title":"Maxmachines","default":0},"maxAwakeMachines":{"type":"integer","title":"Maxawakemachines","default":0},"billingUrl":{"type":"string","title":"Billingurl","default":""},"mcpUrl":{"type":"string","title":"Mcpurl","default":""},"mcp":{"$ref":"#/components/schemas/McpStatusOut"},"windowsAvailable":{"type":"boolean","title":"Windowsavailable","default":false},"androidAvailable":{"type":"boolean","title":"Androidavailable","default":false},"androidArmAvailable":{"type":"boolean","title":"Androidarmavailable","default":false}},"type":"object","title":"PlanStatusOut","description":"What the account's one plan allows, as the Computers pages read it.\n\nPlan 37 deleted the Computers plan and its catalog. There is no plan key\nhere to choose and no invocation allowance to spend: a computer is one\nmachine on the account's seat plan, so this reports the seat plan by name\nand the machines it covers. Buying and changing a plan happens once, on\nthe Billing page, which is why the checkout, portal, cancel and resume\nroutes that used to sit beside this one are gone.\n\n``machines`` counts every machine the tenant holds, agents included,\nbecause they share the allowance."},"PortalBody":{"properties":{"flow":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flow"}},"type":"object","title":"PortalBody"},"Preferences":{"properties":{"trace_collection_enabled":{"type":"boolean","title":"Trace Collection Enabled"},"tos_accepted":{"type":"boolean","title":"Tos Accepted"}},"type":"object","required":["trace_collection_enabled","tos_accepted"],"title":"Preferences"},"PreferencesUpdate":{"properties":{"trace_collection_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Trace Collection Enabled"},"tos_accepted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Tos Accepted"}},"type":"object","title":"PreferencesUpdate"},"ProjectChannelResponse":{"properties":{"id":{"type":"string","title":"Id"},"channelType":{"type":"string","title":"Channeltype"},"botUsername":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Botusername"},"webhookUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhookurl"},"enabled":{"type":"boolean","title":"Enabled"},"bindingCount":{"type":"integer","title":"Bindingcount","default":0}},"type":"object","required":["id","channelType","enabled"],"title":"ProjectChannelResponse"},"ProjectInstanceSummary":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status"},"projectRole":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Projectrole"},"bindingCount":{"type":"integer","title":"Bindingcount","default":0},"lastActiveAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastactiveat"}},"type":"object","required":["id","name","status"],"title":"ProjectInstanceSummary"},"ProjectResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"baseAgentId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Baseagentid"},"newChatPolicy":{"type":"string","title":"Newchatpolicy"},"maxInstances":{"type":"integer","title":"Maxinstances"},"warmPoolSize":{"type":"integer","title":"Warmpoolsize","default":0},"instanceComputeMinutesLimit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Instancecomputeminuteslimit"},"warmReady":{"type":"integer","title":"Warmready","default":0},"instances":{"items":{"$ref":"#/components/schemas/ProjectInstanceSummary"},"type":"array","title":"Instances","default":[]},"channels":{"items":{"$ref":"#/components/schemas/ProjectChannelResponse"},"type":"array","title":"Channels","default":[]},"createdAt":{"type":"string","format":"date-time","title":"Createdat"}},"type":"object","required":["id","name","newChatPolicy","maxInstances","createdAt"],"title":"ProjectResponse"},"ProjectUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"newChatPolicy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Newchatpolicy"},"maxInstances":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Maxinstances"},"warmPoolSize":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Warmpoolsize"},"instanceComputeMinutesLimit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Instancecomputeminuteslimit"}},"type":"object","title":"ProjectUpdate"},"PublicAgentMeta":{"properties":{"name":{"type":"string","title":"Name"},"framework":{"type":"string","title":"Framework"},"status":{"type":"string","title":"Status"}},"type":"object","required":["name","framework","status"],"title":"PublicAgentMeta"},"PublicChatRequest":{"properties":{"message":{"type":"string","title":"Message"},"conversationId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversationid"}},"type":"object","required":["message"],"title":"PublicChatRequest"},"ReassignBindingRequest":{"properties":{"agentId":{"type":"string","title":"Agentid"}},"type":"object","required":["agentId"],"title":"ReassignBindingRequest"},"RedeemRequest":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"RedeemRequest"},"ResendVerificationRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ResendVerificationRequest","description":"Request schema for re-sending an email-verification link."},"ResetPasswordRequest":{"properties":{"token":{"type":"string","title":"Token"},"password":{"type":"string","title":"Password"}},"type":"object","required":["token","password"],"title":"ResetPasswordRequest","description":"Request schema for completing a password reset."},"ResizeBody":{"properties":{"mem_mb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mem Mb"},"disk_gb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Disk Gb"},"always_on":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Always On"}},"type":"object","title":"ResizeBody"},"RestartRequest":{"properties":{"requestId":{"type":"string","maxLength":128,"minLength":1,"title":"Requestid"}},"additionalProperties":false,"type":"object","required":["requestId"],"title":"RestartRequest","description":"Accepts an explicit caller request identity without changing legacy restart."},"RestartResponse":{"properties":{"operationId":{"type":"string","title":"Operationid"},"agentId":{"type":"string","title":"Agentid"},"generation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generation"},"settingsRevision":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Settingsrevision"},"state":{"$ref":"#/components/schemas/OperationState"},"lastEffect":{"$ref":"#/components/schemas/EffectPhase"},"failure":{"anyOf":[{"$ref":"#/components/schemas/FailureCode"},{"type":"null"}]},"applicationReady":{"type":"string","enum":["confirmed","failed","unknown","not_applicable"],"title":"Applicationready"}},"type":"object","required":["operationId","agentId","generation","settingsRevision","state","lastEffect","failure","applicationReady"],"title":"RestartResponse","description":"Returns only public progress fields in the existing camelCase convention."},"ScreenOut":{"properties":{"width":{"type":"integer","title":"Width"},"height":{"type":"integer","title":"Height"},"modelWidth":{"type":"integer","title":"Modelwidth"}},"type":"object","required":["width","height","modelWidth"],"title":"ScreenOut"},"SessionEventRequest":{"properties":{"action":{"type":"string","pattern":"^(start|heartbeat|end)$","title":"Action"},"session_id":{"type":"string","maxLength":128,"minLength":8,"title":"Session Id"},"path":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Path"},"occurred_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Occurred At"}},"type":"object","required":["action","session_id"],"title":"SessionEventRequest"},"SessionListOut":{"properties":{"sessions":{"items":{"$ref":"#/components/schemas/SessionOut"},"type":"array","title":"Sessions"}},"type":"object","required":["sessions"],"title":"SessionListOut"},"SessionOut":{"properties":{"id":{"type":"string","title":"Id"},"computerId":{"type":"string","title":"Computerid"},"startedAt":{"type":"string","format":"date-time","title":"Startedat"},"lastActionAt":{"type":"string","format":"date-time","title":"Lastactionat"},"endedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Endedat"},"wallSeconds":{"type":"integer","title":"Wallseconds","default":0},"actions":{"type":"integer","title":"Actions","default":0},"screenshots":{"type":"integer","title":"Screenshots","default":0},"bytesOut":{"type":"integer","title":"Bytesout","default":0},"invocationsCharged":{"type":"integer","title":"Invocationscharged","default":1},"endReason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endreason"},"client":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client"},"modelHint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Modelhint"},"graceUntil":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Graceuntil"}},"type":"object","required":["id","computerId","startedAt","lastActionAt"],"title":"SessionOut"},"SessionSummaryOut":{"properties":{"id":{"type":"string","title":"Id"},"startedAt":{"type":"string","format":"date-time","title":"Startedat"},"lastActionAt":{"type":"string","format":"date-time","title":"Lastactionat"},"actions":{"type":"integer","title":"Actions","default":0},"screenshots":{"type":"integer","title":"Screenshots","default":0},"client":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client"}},"type":"object","required":["id","startedAt","lastActionAt"],"title":"SessionSummaryOut","description":"The open session on a computer, as the dashboard list shows it."},"SignedWebhookResponse":{"properties":{"path":{"type":"string","title":"Path"},"scheme":{"type":"string","title":"Scheme"},"url":{"type":"string","title":"Url"}},"type":"object","required":["path","scheme","url"],"title":"SignedWebhookResponse"},"SignedWebhookUpdate":{"properties":{"path":{"type":"string","maxLength":200,"minLength":1,"title":"Path"},"scheme":{"type":"string","const":"spectrum_v0","title":"Scheme"},"secret":{"type":"string","maxLength":512,"minLength":16,"title":"Secret"}},"type":"object","required":["path","scheme","secret"],"title":"SignedWebhookUpdate"},"SignupRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"accountType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accounttype"}},"type":"object","required":["email","password"],"title":"SignupRequest","description":"Request schema for user registration."},"SkillAllowlistBody":{"properties":{"allowlist":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowlist"}},"type":"object","title":"SkillAllowlistBody"},"SkillEnvBody":{"properties":{"env":{"additionalProperties":{"type":"string"},"type":"object","title":"Env"}},"type":"object","required":["env"],"title":"SkillEnvBody"},"SkillInstallBody":{"properties":{"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"git":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Git"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"force":{"type":"boolean","title":"Force","default":false},"env":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Env"}},"type":"object","title":"SkillInstallBody"},"SkillUploadBody":{"properties":{"archiveBase64":{"type":"string","title":"Archivebase64"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"env":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Env"}},"type":"object","required":["archiveBase64"],"title":"SkillUploadBody"},"SubscribeBody":{"properties":{"plan":{"type":"string","title":"Plan"}},"type":"object","required":["plan"],"title":"SubscribeBody"},"SubscriptionResponse":{"properties":{"id":{"type":"string","title":"Id"},"agentId":{"type":"string","title":"Agentid"},"agentName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agentname"},"tier":{"type":"string","title":"Tier"},"status":{"type":"string","title":"Status"},"cancelAtPeriodEnd":{"type":"boolean","title":"Cancelatperiodend"},"currentPeriodStart":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Currentperiodstart"},"currentPeriodEnd":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Currentperiodend"},"canceledAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Canceledat"}},"type":"object","required":["id","agentId","tier","status","cancelAtPeriodEnd"],"title":"SubscriptionResponse","description":"Subscription status information."},"TakeoverCompleteOut":{"properties":{"takeoverSeq":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Takeoverseq"},"screenshot":{"anyOf":[{"$ref":"#/components/schemas/ActionResult"},{"type":"null"}]}},"type":"object","title":"TakeoverCompleteOut"},"TakeoverCompleteRequest":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"note":{"type":"string","maxLength":4096,"title":"Note","default":""}},"type":"object","title":"TakeoverCompleteRequest"},"TakeoverRequest":{"properties":{"mode":{"type":"string","title":"Mode"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"success":{"type":"boolean","title":"Success","default":true},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["mode"],"title":"TakeoverRequest"},"TelegramValidateRequest":{"properties":{"bot_token":{"type":"string","title":"Bot Token"}},"type":"object","required":["bot_token"],"title":"TelegramValidateRequest"},"TopUpRequest":{"properties":{"amount_cents":{"type":"integer","minimum":500.0,"title":"Amount Cents","description":"Amount in cents, minimum $5 (500)"},"return_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Return Path","description":"Path to redirect to after checkout (e.g. /enterprise)"}},"type":"object","required":["amount_cents"],"title":"TopUpRequest"},"TriggerCreate":{"properties":{"type":{"type":"string","title":"Type"},"config":{"additionalProperties":true,"type":"object","title":"Config","default":{}},"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","required":["type"],"title":"TriggerCreate"},"TriggerResponse":{"properties":{"id":{"type":"string","title":"Id"},"agentId":{"type":"string","title":"Agentid"},"type":{"type":"string","title":"Type"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["id","agentId","type","config","enabled"],"title":"TriggerResponse"},"TriggerUpdate":{"properties":{"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"type":"object","title":"TriggerUpdate"},"UnclaimedAgentCreate":{"properties":{"name":{"type":"string","title":"Name"},"templateId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Templateid"},"githubRepo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Githubrepo"},"branch":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Branch"},"imageName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imagename"},"initialEnvVars":{"items":{"$ref":"#/components/schemas/InitialEnvVar"},"type":"array","title":"Initialenvvars","default":[]},"publicWeb":{"type":"boolean","title":"Publicweb","default":false},"exposedPort":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exposedport"},"client":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},"type":"object","required":["name"],"title":"UnclaimedAgentCreate","description":"The anonymous create request. Exactly one of the three sources is set."},"UnclaimedAgentCreated":{"properties":{"agent":{"$ref":"#/components/schemas/UnclaimedAgentSummary"},"token":{"type":"string","title":"Token"},"tokenExpiresAt":{"type":"string","title":"Tokenexpiresat"},"claimUrl":{"type":"string","title":"Claimurl"},"expiresAt":{"type":"string","title":"Expiresat"},"limits":{"$ref":"#/components/schemas/UnclaimedLimits"}},"type":"object","required":["agent","token","tokenExpiresAt","claimUrl","expiresAt","limits"],"title":"UnclaimedAgentCreated","description":"The anonymous create response."},"UnclaimedAgentSummary":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"status":{"type":"string","title":"Status"},"framework":{"type":"string","title":"Framework"}},"type":"object","required":["id","name","status","framework"],"title":"UnclaimedAgentSummary","description":"The created agent, as the anonymous caller sees it."},"UnclaimedLimits":{"properties":{"machines":{"type":"integer","title":"Machines"},"llmProxy":{"type":"string","title":"Llmproxy"},"ttlHours":{"type":"integer","title":"Ttlhours"}},"type":"object","required":["machines","llmProxy","ttlHours"],"title":"UnclaimedLimits","description":"The limits of a throwaway account, stated in the response."},"UsageOut":{"properties":{"from":{"type":"string","format":"date-time","title":"From"},"to":{"type":"string","format":"date-time","title":"To"},"invocations":{"type":"integer","title":"Invocations","default":0},"wallSeconds":{"type":"integer","title":"Wallseconds","default":0},"actions":{"type":"integer","title":"Actions","default":0},"screenshots":{"type":"integer","title":"Screenshots","default":0},"computers":{"items":{"$ref":"#/components/schemas/ComputerUsageOut"},"type":"array","title":"Computers"}},"type":"object","required":["from","to"],"title":"UsageOut"},"UsageReport":{"properties":{"periodStart":{"type":"string","format":"date-time","title":"Periodstart"},"periodEnd":{"type":"string","format":"date-time","title":"Periodend"},"hostingBasis":{"type":"string","title":"Hostingbasis","default":"metered"},"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"},"computeMinutes":{"type":"number","title":"Computeminutes"},"hostingCostCents":{"type":"integer","title":"Hostingcostcents"},"llmCostCents":{"type":"number","title":"Llmcostcents"},"totalCostCents":{"type":"number","title":"Totalcostcents"},"agents":{"items":{"$ref":"#/components/schemas/AgentUsage"},"type":"array","title":"Agents"}},"type":"object","required":["periodStart","periodEnd","computeMinutes","hostingCostCents","llmCostCents","totalCostCents","agents"],"title":"UsageReport"},"UserResponse":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image"}},"type":"object","required":["id","email"],"title":"UserResponse","description":"Response schema for user data (excludes password hash)."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyEmailRequest":{"properties":{"token":{"type":"string","title":"Token"}},"type":"object","required":["token"],"title":"VerifyEmailRequest","description":"Request schema for confirming an email-verification token."},"ViewerOut":{"properties":{"url":{"type":"string","title":"Url"},"expiresAt":{"type":"string","format":"date-time","title":"Expiresat"},"mode":{"type":"string","enum":["watch","control"],"title":"Mode"}},"type":"object","required":["url","expiresAt","mode"],"title":"ViewerOut"},"ViewerRequest":{"properties":{"mode":{"type":"string","enum":["watch","control"],"title":"Mode","default":"watch"},"ttlS":{"type":"integer","maximum":3600.0,"minimum":30.0,"title":"Ttls","default":600},"reason":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Reason"}},"type":"object","title":"ViewerRequest"},"WakeOut":{"properties":{"status":{"type":"string","title":"Status"},"wakeMs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Wakems"},"method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Method"}},"type":"object","required":["status"],"title":"WakeOut"},"WalletBalanceResponse":{"properties":{"balanceCents":{"type":"integer","title":"Balancecents"},"balanceDollars":{"type":"number","title":"Balancedollars"}},"type":"object","required":["balanceCents","balanceDollars"],"title":"WalletBalanceResponse"},"WebhookCreate":{"properties":{"url":{"type":"string","title":"Url","description":"HTTPS endpoint that will receive POSTed events (public hosts only)"},"events":{"items":{"type":"string"},"type":"array","title":"Events","description":"Events to receive (subset of ['agent.deployed', 'agent.error', 'agent.restarted', 'agent.sleeping', 'agent.stopped', 'agent.woken', 'message.failed', 'message.reply']). Empty = all."}},"type":"object","required":["url"],"title":"WebhookCreate"},"WebhookCreated":{"properties":{"id":{"type":"string","title":"Id"},"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string"},"type":"array","title":"Events"},"isActive":{"type":"boolean","title":"Isactive"},"lastDeliveredAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastdeliveredat"},"lastStatusCode":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Laststatuscode"},"consecutiveFailures":{"type":"integer","title":"Consecutivefailures"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"secret":{"type":"string","title":"Secret","description":"Signing secret, shown once. Verify X-Maritime-Signature with it."}},"type":"object","required":["id","url","events","isActive","lastDeliveredAt","lastStatusCode","consecutiveFailures","createdAt","secret"],"title":"WebhookCreated"},"WebhookDeliveryResponse":{"properties":{"id":{"type":"string","title":"Id"},"subscriptionId":{"type":"string","title":"Subscriptionid"},"event":{"type":"string","title":"Event"},"status":{"type":"string","title":"Status"},"attempts":{"type":"integer","title":"Attempts"},"nextAttemptAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Nextattemptat"},"lastStatusCode":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Laststatuscode"},"lastError":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lasterror"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"deliveredAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deliveredat"},"payload":{"additionalProperties":true,"type":"object","title":"Payload"}},"type":"object","required":["id","subscriptionId","event","status","attempts","createdAt","payload"],"title":"WebhookDeliveryResponse"},"WebhookResponse":{"properties":{"id":{"type":"string","title":"Id"},"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string"},"type":"array","title":"Events"},"isActive":{"type":"boolean","title":"Isactive"},"lastDeliveredAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lastdeliveredat"},"lastStatusCode":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Laststatuscode"},"consecutiveFailures":{"type":"integer","title":"Consecutivefailures"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"}},"type":"object","required":["id","url","events","isActive","lastDeliveredAt","lastStatusCode","consecutiveFailures","createdAt"],"title":"WebhookResponse"},"WebhookUpdate":{"properties":{"events":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Events"},"isActive":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Isactive"}},"type":"object","title":"WebhookUpdate"},"WelcomeEmailRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"WelcomeEmailRequest","description":"Request schema for triggering the one-time welcome email."}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}