{"openapi":"3.1.0","info":{"title":"Chamade","version":"0.1.0"},"paths":{"/auth/signup":{"post":{"tags":["auth"],"summary":"Signup","operationId":"signup_auth_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/verify":{"get":{"tags":["auth"],"summary":"Verify Email","description":"Verify email address via token link.","operationId":"verify_email_auth_verify_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/resend-verification":{"post":{"tags":["auth"],"summary":"Resend Verification","description":"Resend verification email for the current session user.","operationId":"resend_verification_auth_resend_verification_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/forgot-password":{"post":{"tags":["auth"],"summary":"Forgot Password","description":"Send a password reset email. Always returns 200 to avoid user enumeration.","operationId":"forgot_password_auth_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/reset-password":{"post":{"tags":["auth"],"summary":"Reset Password","description":"Reset password using a token from the reset email.","operationId":"reset_password_auth_reset_password_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Reset Password Page","operationId":"reset_password_page_auth_reset_password_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","operationId":"logout_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/identities":{"get":{"tags":["auth"],"summary":"List My Identities","operationId":"list_my_identities_auth_identities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/identities/{identity_id}":{"delete":{"tags":["auth"],"summary":"Unlink Identity","operationId":"unlink_identity_auth_identities__identity_id__delete","parameters":[{"name":"identity_id","in":"path","required":true,"schema":{"type":"string","title":"Identity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/oauth/{provider}/start":{"get":{"tags":["auth"],"summary":"Oauth Login Start","description":"Kick off a federated sign-in flow. Redirects to the IdP.","operationId":"oauth_login_start_auth_oauth__provider__start_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/oauth/{provider}/callback":{"get":{"tags":["auth"],"summary":"Oauth Login Callback","operationId":"oauth_login_callback_auth_oauth__provider__callback_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"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/usage":{"get":{"tags":["dashboard"],"summary":"Get Usage","operationId":"get_usage_api_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/platforms":{"get":{"tags":["dashboard"],"summary":"List Platforms","operationId":"list_platforms_api_platforms_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/platforms/{provider}/test-dm":{"post":{"tags":["dashboard"],"summary":"Test Platform Dm","description":"Send a test DM to the user's own account on the connected platform.\n\nProves the Chamade → platform leg independently of the agent. Used by\nthe dashboard's per-platform Test button. With multi-account, the\ndashboard sends `?connection_id=…` from the specific card the user\nclicked; without it we fall back to the most recently-connected\naccount for that provider.","operationId":"test_platform_dm_api_platforms__provider__test_dm_post","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"connection_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Connection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/oauth/start/{provider}":{"post":{"tags":["dashboard"],"summary":"Oauth Start","operationId":"oauth_start_api_oauth_start__provider__post","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/OAuthStartRequest"},{"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"}}}}}}},"/api/oauth/{provider}/callback":{"get":{"tags":["dashboard"],"summary":"Oauth Callback","operationId":"oauth_callback_api_oauth__provider__callback_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/oauth/teams-admin-consent/start":{"post":{"tags":["dashboard"],"summary":"Teams Admin Consent Start","description":"Return the admin-consent URL for one exact Microsoft connection.\n\nFrontend opens it in a new tab; admin clicks Accept; MS redirects back\nto /oauth/teams-admin-consent/callback which marks only the connection\ncaptured in this browser/session-bound, one-time state.","operationId":"teams_admin_consent_start_api_oauth_teams_admin_consent_start_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamsAdminConsentStartRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/oauth/teams-admin-consent/callback":{"get":{"tags":["dashboard"],"summary":"Teams Admin Consent Callback","operationId":"teams_admin_consent_callback_api_oauth_teams_admin_consent_callback_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/connections/{connection_id}":{"delete":{"tags":["dashboard"],"summary":"Disconnect Provider","operationId":"disconnect_provider_api_connections__connection_id__delete","parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/telegram/connect":{"post":{"tags":["dashboard"],"summary":"Telegram Connect","description":"Generate a Telegram deep link for connecting the user's Telegram account.","operationId":"telegram_connect_api_telegram_connect_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/api-keys":{"get":{"tags":["dashboard"],"summary":"List Api Keys","operationId":"list_api_keys_api_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["dashboard"],"summary":"Create Api Key Endpoint","operationId":"create_api_key_endpoint_api_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/api-keys/{key_id}":{"delete":{"tags":["dashboard"],"summary":"Revoke Api Key","operationId":"revoke_api_key_api_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/settings-keys":{"get":{"tags":["dashboard"],"summary":"List Settings Keys","operationId":"list_settings_keys_api_settings_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["dashboard"],"summary":"Create Settings Key","operationId":"create_settings_key_api_settings_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/settings-keys/{key_id}":{"delete":{"tags":["dashboard"],"summary":"Revoke Settings Key","operationId":"revoke_settings_key_api_settings_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/mcp-authorizations":{"get":{"tags":["dashboard"],"summary":"List Mcp Authorizations","description":"List active MCP OAuth authorizations for this user, grouped by\nclient. Each grant = one row the user can revoke; revoking kills\nevery access + refresh token still issued against that client.","operationId":"list_mcp_authorizations_api_mcp_authorizations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/mcp-authorizations/{client_id}":{"delete":{"tags":["dashboard"],"summary":"Revoke Mcp Authorization","description":"Revoke every active token issued to `client_id` for this user\nand drop the client's channel membership.\n\nChannel itself is preserved (option a — symmetric with how revoking\na chmd_* key leaves its channel intact). Re-authorizing the same\nclient later creates a fresh channel; the orphan channel left\nbehind is the user's to delete or wire up to another credential.","operationId":"revoke_mcp_authorization_api_mcp_authorizations__client_id__delete","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/keys/test-agent/start":{"post":{"tags":["dashboard"],"summary":"Test Agent Start","description":"Fire the probe and return immediately with the list of keys to watch.\n\nThe dashboard polls /status for progressive results; each ✓ shows up\non a key row as soon as its agent replies, and the poll stops as\nsoon as every active key has answered (no need to wait the full\ntimeout for the common all-replied case).","operationId":"test_agent_start_api_keys_test_agent_start_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TestAgentStartRequest"},{"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"}}}}}}},"/api/keys/test-agent/status":{"get":{"tags":["dashboard"],"summary":"Test Agent Status","description":"Poll the in-flight probe. `done` is True once every key has replied\nor the 30s deadline has passed — at that point the response also\ncarries the session-state signals used by the dashboard summary.","operationId":"test_agent_status_api_keys_test_agent_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/invite-link":{"post":{"tags":["dashboard"],"summary":"Generate Invite Link","description":"Generate a temporary invite token (15 min) for WhatsApp/Telegram messaging.","operationId":"generate_invite_link_api_invite_link_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/feedback":{"post":{"tags":["dashboard"],"summary":"Submit Feedback","description":"Receive beta feedback from a logged-in user. Store + email.\n\nWhen the user is reporting an incorrect in-product diagnosis, the body\ncarries extra `surface`/`provider`/`error_detail`/`suggestion_shown`\nfields. They're persisted alongside the free-form message so the team\ninbox has the full context without needing a second table.","operationId":"submit_feedback_api_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/slack/install":{"post":{"tags":["dashboard"],"summary":"Slack Install","description":"Generate Slack OAuth authorize URL for 'Add to Workspace'.","operationId":"slack_install_api_slack_install_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/slack/callback":{"get":{"tags":["dashboard"],"summary":"Slack Callback","description":"Handle Slack OAuth callback — exchange code for bot token, store connection.","operationId":"slack_callback_api_slack_callback_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/bot-tokens":{"get":{"tags":["dashboard"],"summary":"List Bot Tokens","operationId":"list_bot_tokens_api_bot_tokens_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["dashboard"],"summary":"Create Bot Token","operationId":"create_bot_token_api_bot_tokens_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBotTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bot-tokens/{bot_id}":{"delete":{"tags":["dashboard"],"summary":"Delete Bot Token","operationId":"delete_bot_token_api_bot_tokens__bot_id__delete","parameters":[{"name":"bot_id","in":"path","required":true,"schema":{"type":"string","title":"Bot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/change-password":{"post":{"tags":["dashboard"],"summary":"Change Password","description":"Change password (requires current password).","operationId":"change_password_api_change_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/change-email":{"post":{"tags":["dashboard"],"summary":"Change Email","description":"Request email change (GDPR right to rectification). Sends verification to new address.","operationId":"change_email_api_change_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/verify-email-change":{"get":{"tags":["dashboard"],"summary":"Verify Email Change","description":"Confirm email change via verification token.","operationId":"verify_email_change_api_verify_email_change_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account":{"get":{"tags":["call"],"summary":"Get Account","description":"Return account status: plan, credit/quota, platform readiness, and\nper-platform identity map (agent/operator) + inbox cursor.\n\nThe identity map lets an agent anchor its perspective on cold start:\nfor each connected platform it learns its own bot handle and (when\nthe human operator has linked a personal account) the operator's\nhandle on that platform — so self-chats are never mistaken for\nthird-party conversations.","operationId":"get_account_api_account_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"delete":{"tags":["dashboard"],"summary":"Delete Account","description":"Delete account and all associated data (GDPR right to erasure).","operationId":"delete_account_api_account_delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccountRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/export":{"get":{"tags":["dashboard"],"summary":"Export Data","description":"Export all user data as JSON (GDPR right to data portability).\n\nConfig-tier: a full-account data dump is account administration, not a\ncontrol-plane op — an agent key must not be able to exfiltrate it.\nSession or settings key only.","operationId":"export_data_api_export_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/call":{"post":{"tags":["call"],"summary":"Create Call Endpoint","operationId":"create_call_endpoint_api_call_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCallRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/calls":{"get":{"tags":["call"],"summary":"List Calls Endpoint","operationId":"list_calls_endpoint_api_calls_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/call/{call_id}":{"get":{"tags":["call"],"summary":"Get Call Endpoint","operationId":"get_call_endpoint_api_call__call_id__get","parameters":[{"name":"call_id","in":"path","required":true,"schema":{"type":"string","title":"Call Id"}},{"name":"since","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Since"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["call"],"summary":"End Call Endpoint","description":"End a call.\n\nMarks the call as ended in the DB immediately and schedules the\nMaquisard-side cleanup (room destroy, connector disconnect, mixer\ndrain) as a background task. Returns 202 so agent clients can\nfire-and-forget without hitting the httpx default 10s timeout —\nsome platforms (notably Discord) take 5-8s to gracefully tear down\nvoice state, which used to cause `DELETE /api/call` to stall well\nbeyond a typical client timeout even though the call was already\nhung up on the server side.","operationId":"end_call_endpoint_api_call__call_id__delete","parameters":[{"name":"call_id","in":"path","required":true,"schema":{"type":"string","title":"Call Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/call/{call_id}/accept":{"post":{"tags":["call"],"summary":"Accept Call Endpoint","description":"Accept (answer) a ringing inbound call.","operationId":"accept_call_endpoint_api_call__call_id__accept_post","parameters":[{"name":"call_id","in":"path","required":true,"schema":{"type":"string","title":"Call Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/call/{call_id}/answer":{"post":{"tags":["call"],"summary":"Answer Call Legacy","description":"Alias for /accept (deprecated).","operationId":"answer_call_legacy_api_call__call_id__answer_post","parameters":[{"name":"call_id","in":"path","required":true,"schema":{"type":"string","title":"Call Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/call/{call_id}/refuse":{"post":{"tags":["call"],"summary":"Refuse Call Endpoint","description":"Refuse (reject) a ringing inbound call.","operationId":"refuse_call_endpoint_api_call__call_id__refuse_post","parameters":[{"name":"call_id","in":"path","required":true,"schema":{"type":"string","title":"Call Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/call/{call_id}/say":{"post":{"tags":["call"],"summary":"Say Endpoint","description":"Send text to be spoken via TTS in the call.","operationId":"say_endpoint_api_call__call_id__say_post","parameters":[{"name":"call_id","in":"path","required":true,"schema":{"type":"string","title":"Call Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SayRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/call/{call_id}/stop-speaking":{"post":{"tags":["call"],"summary":"Stop Speaking Endpoint","description":"Cancel any in-flight TTS utterance — agent-initiated self-interrupt.\n\nUseful when the agent changed its mind mid-sentence (new input arrived,\nuser asked it to stop, downstream tool returned a faster answer). Fires\nan ``InterruptionFrame`` into the room's Pipecat TTS pipeline, which\nflushes the current utterance buffer and mutes playback immediately.","operationId":"stop_speaking_endpoint_api_call__call_id__stop_speaking_post","parameters":[{"name":"call_id","in":"path","required":true,"schema":{"type":"string","title":"Call Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/call/{call_id}/chat":{"post":{"tags":["call"],"summary":"Chat Endpoint","description":"Send a chat message to the meeting.\n\nOptional `attachments: [{file_id} | {url, name?, mime?} |\n{bytes_b64, name, mime}]`. `text` acts as caption. At least one of\n`text` or `attachments` must be present.","operationId":"chat_endpoint_api_call__call_id__chat_post","parameters":[{"name":"call_id","in":"path","required":true,"schema":{"type":"string","title":"Call 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/call/{call_id}/typing":{"post":{"tags":["call"],"summary":"Typing Endpoint","description":"Send a typing indicator to the call's chat.","operationId":"typing_endpoint_api_call__call_id__typing_post","parameters":[{"name":"call_id","in":"path","required":true,"schema":{"type":"string","title":"Call Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/maquisard/event":{"post":{"tags":["events"],"summary":"Handle Event","description":"Handle events from Maquisard platform bots.\n\nAuthenticated via X-API-Key header (must match our Maquisard API key).","operationId":"handle_event_api_maquisard_event_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/maquisard/talk-bots":{"get":{"tags":["events"],"summary":"List Talk Bots","description":"Return all active NC Talk bot configs for Maquisard to re-register at startup.\n\nMaquisard pulls this endpoint during its startup to recover bot state\nwithout waiting for Chamade to push via the maquisard_restart event.\nSame auth as /event (X-API-Key or Bearer).","operationId":"list_talk_bots_api_maquisard_talk_bots_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/teams/chat":{"post":{"tags":["teams"],"summary":"Teams Chat","description":"Receive Teams DM from Hermes.\n\nHermes forwards personal chat messages here. We resolve the user\nvia sender_aad_id → connections.provider_user_id, store the message,\nand wait for a sync reply from the agent (10s timeout).\n\nAuthenticated via X-API-Key (must match Maquisard API key).","operationId":"teams_chat_api_teams_chat_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/inbox":{"get":{"tags":["inbox"],"summary":"Inbox List","description":"Inbox — three modes depending on params.\n\n1. **Snapshot** (no params): list all active conversations with agent/peer\n   identity metadata and the last message of each as preview.\n2. **Detail** (`?platform=X`): return the active DM + full message history\n   for that platform.\n3. **Delta** (`?last_message_cursor=X`): return only conversations that\n   have new messages since the cursor, grouped with their new messages.\n   Add `?wait=N` to long-poll up to N seconds waiting for new data.\n\nThe response always includes a top-level `cursor` field the agent can\npersist for the next poll.","operationId":"inbox_list_api_inbox_get","parameters":[{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},{"name":"peer","in":"query","required":false,"schema":{"type":"string","description":"Detail mode selector: sibling agent name (case-insensitive) on platform=agent, or remote_id/remote_name on other platforms.","default":"","title":"Peer"},"description":"Detail mode selector: sibling agent name (case-insensitive) on platform=agent, or remote_id/remote_name on other platforms."},{"name":"task","in":"query","required":false,"schema":{"type":"string","description":"Detail mode selector for the task suffix of an internal platform=agent conversation.","default":"","title":"Task"},"description":"Detail mode selector for the task suffix of an internal platform=agent conversation."},{"name":"last_message_cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Delta mode: return only conversations with new messages since this cursor. Accepts either the precise format '<iso>|<msg_id>' (returned by previous calls for polling loops) or a plain ISO timestamp '<iso>' for ad-hoc date queries (e.g. 'all messages since midnight today').","title":"Last Message Cursor"},"description":"Delta mode: return only conversations with new messages since this cursor. Accepts either the precise format '<iso>|<msg_id>' (returned by previous calls for polling loops) or a plain ISO timestamp '<iso>' for ad-hoc date queries (e.g. 'all messages since midnight today')."},{"name":"wait","in":"query","required":false,"schema":{"type":"integer","maximum":120,"minimum":0,"description":"Long polling: if set together with `last_message_cursor`, the request blocks for up to `wait` seconds waiting for a new message. Clamped to 55s server-side (below nginx proxy_read_timeout). Ignored when `last_message_cursor` is absent.","default":0,"title":"Wait"},"description":"Long polling: if set together with `last_message_cursor`, the request blocks for up to `wait` seconds waiting for a new message. Clamped to 55s server-side (below nginx proxy_read_timeout). Ignored when `last_message_cursor` is absent."},{"name":"call_event_cursor","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Call-event ring-buffer cursor (monotonic int). Return `call_events` with seq > this value, then echo `call_event_cursor` in the response for the next poll. 0 on cold start pulls the full buffer (capped at ~100 events / user); use the `call_event_cursor` from a snapshot to start at 'events from now' instead.","default":0,"title":"Call Event Cursor"},"description":"Call-event ring-buffer cursor (monotonic int). Return `call_events` with seq > this value, then echo `call_event_cursor` in the response for the next poll. 0 on cold start pulls the full buffer (capped at ~100 events / user); use the `call_event_cursor` from a snapshot to start at 'events from now' instead."},{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"active","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/inbox/{conversation_id}":{"get":{"tags":["inbox"],"summary":"Inbox Detail","description":"Get conversation detail with messages.","operationId":"inbox_detail_api_inbox__conversation_id__get","parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"since_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["inbox"],"summary":"Close Conversation Endpoint","description":"Close a conversation.","operationId":"close_conversation_endpoint_api_inbox__conversation_id__delete","parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/send":{"post":{"tags":["inbox"],"summary":"Send Message","description":"Send a message to a conversation (by conversation_id).\n\nReturns 200 (delivered) or 202 (queued) — see `POST /api/dm/chat`.","operationId":"send_message_api_send_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/typing":{"post":{"tags":["inbox"],"summary":"Typing Endpoint","description":"Send a typing indicator to a conversation (by conversation_id).","operationId":"typing_endpoint_api_typing_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TypingRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dm/chat":{"post":{"tags":["dm"],"summary":"Dm Chat","description":"Send a message to the active DM on a platform.\n\nOptional `attachments: [{file_id} | {url, name?, mime?} |\n{bytes_b64, name, mime}]`. Mixed is fine. `text` acts as the caption.\nRequires at least one of `text` or `attachments`.\n\nReturns:\n  - **200 OK** with `{status: \"delivered\", ...}` when the message was\n    sent immediately to the platform (nominal case).\n  - **202 Accepted** with `{status: \"queued\", reason, template_sent, queue_position, ...}`\n    when the WhatsApp 24h customer service window is closed. The message\n    is stored and will be delivered automatically when the user replies\n    to the re-engagement template. Agents receive a `dm_delivered`\n    event on the inbox WebSocket once the pending messages are flushed.","operationId":"dm_chat_api_dm_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DmChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dm/typing":{"post":{"tags":["dm"],"summary":"Dm Typing","description":"Send a typing indicator to the active DM on a platform.","operationId":"dm_typing_api_dm_typing_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DmTypingRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reply/dm":{"post":{"tags":["reply"],"summary":"Reply Dm","description":"Reply to the DM conversation pinned by the reply token.\n\nSame body as POST /api/dm/chat minus the platform/account selectors —\nthe token already names the conversation. Returns 200 on direct\ndelivery, 202 if the message was queued (e.g. WhatsApp outside the\n24h customer service window).","operationId":"reply_dm_api_reply_dm_post","parameters":[{"name":"x-chamade-reply-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Chamade-Reply-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_ReplyDmBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reply/dm/typing":{"post":{"tags":["reply"],"summary":"Reply Dm Typing","description":"Send a typing indicator on the pinned DM conversation.","operationId":"reply_dm_typing_api_reply_dm_typing_post","parameters":[{"name":"x-chamade-reply-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Chamade-Reply-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reply/call/say":{"post":{"tags":["reply"],"summary":"Reply Call Say","description":"Speak text via hosted TTS in the pinned call.","operationId":"reply_call_say_api_reply_call_say_post","parameters":[{"name":"x-chamade-reply-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Chamade-Reply-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_ReplyCallSayBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reply/call/chat":{"post":{"tags":["reply"],"summary":"Reply Call Chat","description":"Send a chat message into the pinned call's meeting chat.","operationId":"reply_call_chat_api_reply_call_chat_post","parameters":[{"name":"x-chamade-reply-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Chamade-Reply-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_ReplyCallChatBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reply/call/typing":{"post":{"tags":["reply"],"summary":"Reply Call Typing","description":"Send a typing indicator into the pinned call's meeting chat.","operationId":"reply_call_typing_api_reply_call_typing_post","parameters":[{"name":"x-chamade-reply-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Chamade-Reply-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/nctalk/preflight":{"post":{"tags":["nctalk"],"summary":"Nctalk Preflight","description":"Lightweight check: is the chamade_talk addon installed on this NC?\n\nUsed by the dashboard's \"Connect\" button to fail fast with a\nhuman-readable message before redirecting the browser into a 404\non the user's own NC. No state is created — purely a probe.","operationId":"nctalk_preflight_api_nctalk_preflight_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NcTalkConnectRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/nctalk/connect":{"post":{"tags":["nctalk"],"summary":"Nctalk Connect","description":"Start NC Talk connection flow — redirect to addon authorize page.","operationId":"nctalk_connect_api_nctalk_connect_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NcTalkConnectRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/nctalk/callback":{"post":{"tags":["nctalk"],"summary":"Nctalk Callback","description":"Receive callback from NC Talk addon after user approval.\n\nThis is a server-to-server POST from the addon, not a browser redirect.\n\nThe addon's HTTP client has a 15s timeout (AuthorizeController.php).\nIf this handler does too much synchronous work before responding, the\naddon times out, logs \"Authorize callback failed\" and deletes the bot\nuser it just created — leaving Chamade's DB pointing to a ghost. So\nwe strictly do the minimum (verify state, store connection) before\nreturning and push the nice-to-have side effects (avatar upload,\nMaquisard register, welcome DM) to a background task.","operationId":"nctalk_callback_api_nctalk_callback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NcTalkCallbackRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/nctalk/{connection_id}":{"delete":{"tags":["nctalk"],"summary":"Nctalk Disconnect","operationId":"nctalk_disconnect_api_nctalk__connection_id__delete","parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connect/nctalk":{"get":{"tags":["nctalk-connect"],"summary":"Nctalk Connect Consent","description":"Consent screen. GET /connect/nctalk?nc_state=...&nc_url=...&origin=...\n\nRequires a Chamade session. If the user isn't logged in, bounce\nthrough /auth/login with ?next= preserving the full URL so they land\nback here after auth.","operationId":"nctalk_connect_consent_connect_nctalk_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/connect/nctalk/approve":{"post":{"tags":["nctalk-connect"],"summary":"Nctalk Connect Approve","description":"Approve (or deny) the pairing. On approve, generate chamade_state\nbound to (user_id, nc_url) and redirect back to the addon's finish\nendpoint.","operationId":"nctalk_connect_approve_connect_nctalk_approve_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_nctalk_connect_approve_connect_nctalk_approve_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/voice-configs/schema":{"get":{"tags":["voice-config"],"summary":"Get Schema","description":"Catalog of supported providers + option fields (drives the dashboard form).","operationId":"get_schema_api_voice_configs_schema_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/voice-configs":{"get":{"tags":["voice-config"],"summary":"List Voice Configs","operationId":"list_voice_configs_api_voice_configs_get","parameters":[{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["voice-config"],"summary":"Create Voice Config","operationId":"create_voice_config_api_voice_configs_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/voice-configs/{config_id}":{"patch":{"tags":["voice-config"],"summary":"Update Voice Config","operationId":"update_voice_config_api_voice_configs__config_id__patch","parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"string","title":"Config Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["voice-config"],"summary":"Delete Voice Config","operationId":"delete_voice_config_api_voice_configs__config_id__delete","parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"string","title":"Config Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/voice-configs/{config_id}/reactivate":{"post":{"tags":["voice-config"],"summary":"Reactivate Voice Config","description":"Retry a suspended preset: re-probe the stored key, lift the suspension\nif it's accepted again. 400 (with the provider error) if still rejected.","operationId":"reactivate_voice_config_api_voice_configs__config_id__reactivate_post","parameters":[{"name":"config_id","in":"path","required":true,"schema":{"type":"string","title":"Config Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/providers/{provider}/voices":{"post":{"tags":["voice-config"],"summary":"List Voices","description":"Proxy to the provider's voice catalog.\n\nTwo modes:\n  - ``api_key`` in body: brand-new preset, key not yet persisted.\n  - ``config_id`` in body: existing preset, server decrypts the stored\n    key so the user doesn't have to re-enter it on Edit. Ownership is\n    enforced by ``get_config(user_id, config_id)``.\n\nAccepting the key in the POST body (vs a GET ?api_key=) keeps it out of\naccess logs and browser history.","operationId":"list_voices_api_providers__provider__voices_post","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListVoicesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/checkout":{"post":{"tags":["billing"],"summary":"Checkout","description":"Create a Stripe Checkout session for Pro upgrade.","operationId":"checkout_api_billing_checkout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/buy-credit":{"post":{"tags":["billing"],"summary":"Buy Credit","description":"Create a Stripe Checkout session for credit top-up.","operationId":"buy_credit_api_billing_buy_credit_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/portal":{"post":{"tags":["billing"],"summary":"Portal","description":"Create a Stripe Customer Portal session for subscription management.","operationId":"portal_api_billing_portal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/billing/history":{"get":{"tags":["billing"],"summary":"Billing History","description":"Get billing event history for the current user.","operationId":"billing_history_api_billing_history_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/stripe/webhook":{"post":{"tags":["billing"],"summary":"Stripe Webhook","description":"Handle Stripe webhook events (signature-verified).","operationId":"stripe_webhook_api_stripe_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/sip/trunk":{"get":{"tags":["sip"],"summary":"Get Sip Trunk","description":"Get SIP trunk info (NOT password).","operationId":"get_sip_trunk_api_sip_trunk_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["sip"],"summary":"Connect Sip Trunk","description":"Connect a SIP trunk (BYOT). Stores encrypted credentials.","operationId":"connect_sip_trunk_api_sip_trunk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectTrunkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["sip"],"summary":"Disconnect Sip Trunk","description":"Disconnect SIP trunk + release all BYOT DIDs.","operationId":"disconnect_sip_trunk_api_sip_trunk_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/sip/trunk/dids":{"post":{"tags":["sip"],"summary":"Add Byot Did","description":"Add a BYOT DID (register in Maquisard for inbound routing).","operationId":"add_byot_did_api_sip_trunk_dids_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddByotDidRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sip/trunk/dids/{did_id}":{"delete":{"tags":["sip"],"summary":"Remove Byot Did","description":"Remove a BYOT DID (release in Maquisard).","operationId":"remove_byot_did_api_sip_trunk_dids__did_id__delete","parameters":[{"name":"did_id","in":"path","required":true,"schema":{"type":"string","title":"Did Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sip/trunk/dids/{did_id}/settings":{"post":{"tags":["sip"],"summary":"Update Byot Did Settings","description":"Update auto_answer for a BYOT DID.","operationId":"update_byot_did_settings_api_sip_trunk_dids__did_id__settings_post","parameters":[{"name":"did_id","in":"path","required":true,"schema":{"type":"string","title":"Did Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ByotDidSettingsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/whatsapp/webhook":{"get":{"tags":["whatsapp"],"summary":"Verify Webhook","operationId":"verify_webhook_api_whatsapp_webhook_get","parameters":[{"name":"hub.mode","in":"query","required":false,"schema":{"type":"string","default":"","title":"Hub.Mode"}},{"name":"hub.challenge","in":"query","required":false,"schema":{"type":"string","default":"","title":"Hub.Challenge"}},{"name":"hub.verify_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Hub.Verify Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["whatsapp"],"summary":"Receive Webhook","operationId":"receive_webhook_api_whatsapp_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/files/reserve":{"post":{"tags":["files"],"summary":"Reserve Upload Endpoint","description":"Mint a pre-signed upload slot. Returns `{file_id, upload_url,\nexpires_at}` — the caller (typically the MCP tool\n`chamade_file_upload_url`) then POSTs a multipart form to\n`upload_url` within 5 min to deliver the bytes. No auth header is\nrequired on the upload endpoint — the token in the URL is the\nauthorization.","operationId":"reserve_upload_endpoint_api_files_reserve_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_ReserveUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Reserve Upload Endpoint Api Files Reserve Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/files/u/{token}":{"post":{"tags":["files"],"summary":"Fill Reserved Upload Endpoint","description":"Fill a reserved upload slot. No auth header — the token in the\nURL is the authorization (single-use, 5 min TTL, minted by the\nauthenticated `/api/files/reserve` call). Returns the same shape\nas `POST /api/files`: `{file_id, url, name, mime, size, expires_at}`.\nSubsequent POSTs to the same URL return 404.","operationId":"fill_reserved_upload_endpoint_api_files_u__token__post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_fill_reserved_upload_endpoint_api_files_u__token__post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Fill Reserved Upload Endpoint Api Files U  Token  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/files":{"post":{"tags":["files"],"summary":"Upload File","description":"Upload a file and stage it for a subsequent send. Three input paths:\n\n* multipart/form-data: `file=<bytes>` (optionally `name`, `mime`)\n* JSON `{\"bytes_b64\": \"...\", \"name\": \"...\", \"mime\": \"...\"}` for inline\n  bytes\n* JSON `{\"url\": \"...\", \"name\": \"...\", \"mime\": \"...\"}` to fetch from an\n  external URL (SSRF-guarded)\n\nReturns `{file_id, url, name, mime, size, expires_at}`. The `file_id`\nis the same opaque token that's served at `/api/files/{token}` and\ncan be passed back in `attachments: [{file_id}]` on `/api/dm/chat`\nor `/api/call/{id}/chat`.","operationId":"upload_file_api_files_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_file_api_files_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/files/{token}":{"get":{"tags":["files"],"summary":"Serve File","description":"Serve a file attachment by its opaque token.\n\nAuth: the token itself is the capability. We do not require a session\nor API key here because the URL is handed out inline in inbox payloads\nand agents often stream these through non-authenticated downstreams.\nBrute-force is gated by the 24-byte url-safe token space.","operationId":"serve_file_api_files__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"head":{"tags":["files"],"summary":"Serve File","description":"Serve a file attachment by its opaque token.\n\nAuth: the token itself is the capability. We do not require a session\nor API key here because the URL is handed out inline in inbox payloads\nand agents often stream these through non-authenticated downstreams.\nBrute-force is gated by the 24-byte url-safe token space.","operationId":"serve_file_api_files__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/snapshot":{"get":{"tags":["admin"],"summary":"Admin Snapshot","description":"Ops briefing for the `check` command.\n\n```\nGET /api/admin/snapshot?since=24h\nX-API-Key: <maquisard_api_key>\n```\n\n`since` accepts shorthand (`30m`, `2h`, `24h`, `7d`) or ISO-8601. Default: 24h.\nSee `scripts/prod-snapshot.sh` for the wrapper that renders this as Markdown.","operationId":"admin_snapshot_api_admin_snapshot_get","parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/e2ee/heartbeat":{"post":{"tags":["e2ee"],"summary":"Heartbeat","description":"Record an addon heartbeat.\n\nTwo lookup modes:\n- `connection_id` provided → target that exact row. api_secret must\n  match its stored credentials.\n- `connection_id` empty → fan out: every active connection on the\n  platform whose stored api_secret matches gets updated. This is\n  the per-instance case: a single NC addon serves N Chamade users\n  and broadcasts its capability state to all of them at once.\n\napi_secret mismatch on the single-row path returns 403 so a misconfigured\naddon fails loud. On the fan-out path, rows whose secret does not match\nare silently skipped (some may be stale connections from a previous\naddon install with a different secret).","operationId":"heartbeat_api_e2ee_heartbeat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/E2eeHeartbeatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/e2ee/shim-status":{"post":{"tags":["e2ee"],"summary":"Shim Status","description":"Shim heartbeat → update the in-memory status cache for the dashboard.","operationId":"shim_status_api_e2ee_shim_status_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShimStatusRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/e2ee/status":{"get":{"tags":["e2ee"],"summary":"Aggregated Status","description":"Dashboard status endpoint — addon heartbeats (DB) + shim heartbeats\n(in-memory cache), aggregated into the 4 LED signals documented in\ndocs/E2EE.md §10.","operationId":"aggregated_status_api_e2ee_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/e2ee/scheme/{name}/relay":{"post":{"tags":["e2ee"],"summary":"Scheme Relay","description":"Opaque relay for scheme-specific payloads.\n\nV1: no scheme has a handler registered — every request returns 501.\nThe endpoint exists to freeze the contract before Matrix ships, so\nthat future schemes plug in without touching the wire.","operationId":"scheme_relay_api_e2ee_scheme__name__relay_post","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/E2eeRelayRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/providers":{"get":{"tags":["agents"],"summary":"List Providers","description":"Return the catalog of registered providers for the dashboard picker.","operationId":"list_providers_api_agents_providers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/agents":{"get":{"tags":["agents"],"summary":"List Agents","description":"List the user's agents with their members embedded.\n\nLazy-creates the default agent on first visit so the page always has\na stable anchor even for users who haven't yet created any key or\nconnected any platform.","operationId":"list_agents_api_agents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["agents"],"summary":"Create Agent","description":"Create an empty agent (no provider, no members).","operationId":"create_agent_api_agents_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_CreateAgentBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/_candidates":{"get":{"tags":["agents"],"summary":"List Candidates","description":"Return the platform accounts the user could attach to agents.\n\nPowers the \"+ Add platform\" picker on the agents page.","operationId":"list_candidates_api_agents__candidates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/agents/{agent_id}":{"patch":{"tags":["agents"],"summary":"Rename Agent","operationId":"rename_agent_api_agents__agent_id__patch","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_RenameAgentBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["agents"],"summary":"Delete Agent","operationId":"delete_agent_api_agents__agent_id__delete","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}/discard-if-empty":{"post":{"tags":["agents"],"summary":"Discard If Empty","description":"Delete a freshly-created agent that was never configured.\n\nThe dashboard creates the agent row the moment a provider tile is\nclicked (the OAuth/configure flows need an agent_id upfront). If the\nuser then abandons the form without connecting or configuring anything,\nthat empty row would linger in the list. This removes it — but ONLY when\nthe agent is genuinely pristine: not default, no provider/config/bearer,\nand no attached accounts, keys, OAuth clients, provider-OAuth tokens,\nidentities or engine keys. Anything attached → keep it (no-op). Safe to\ncall on any close; the server is the authority on \"empty\".","operationId":"discard_if_empty_api_agents__agent_id__discard_if_empty_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/agents/{agent_id}/set-default":{"post":{"tags":["agents"],"summary":"Set Default Agent","description":"Move the `is_default=1` badge to this agent.\n\nThe badge tracks \"where do newly connected accounts auto-attach\".\nIt must always sit on exactly one agent per user (schema invariant\nvia partial UNIQUE index `idx_agents_user_default`).","operationId":"set_default_agent_api_agents__agent_id__set_default_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/agents/{agent_id}/status":{"post":{"tags":["agents"],"summary":"Set Agent Status","description":"Enable (active) or disable an agent.\n\nA disabled agent keeps its provider config, members and keys but is\nskipped by the dispatcher — `inbox_hub` only resolves agents with\n`status='active'`, so inbound events stop reaching the provider until\nit's re-enabled.","operationId":"set_agent_status_api_agents__agent_id__status_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/_SetStatusBody"}}}},"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}/keys":{"post":{"tags":["agents"],"summary":"Mint Key In Agent","description":"Generate a fresh API key INSIDE the named agent, sharing its scope.\n\nThe new key is unnamed — the agent's name covers it.","operationId":"mint_key_in_agent_api_agents__agent_id__keys_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/agents/{agent_id}/keys/{key_id}":{"post":{"tags":["agents"],"summary":"Attach Key","description":"Advanced: attach an existing key to an agent. Multi-agent setups\n(key rotation, several personas sharing the same scope, …).","operationId":"attach_key_api_agents__agent_id__keys__key_id__post","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["agents"],"summary":"Detach Key","description":"Detach a key from an agent. Rejects the last detach with 400 so a\nkey never ends up with zero agent scope (which would silently deny\nevery event).","operationId":"detach_key_api_agents__agent_id__keys__key_id__delete","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key 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}/accounts":{"post":{"tags":["agents"],"summary":"Attach Account","operationId":"attach_account_api_agents__agent_id__accounts_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/_AttachAccountBody"}}}},"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}/accounts/{account_type}/{account_id}":{"delete":{"tags":["agents"],"summary":"Detach Account","operationId":"detach_account_api_agents__agent_id__accounts__account_type___account_id__delete","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"account_type","in":"path","required":true,"schema":{"type":"string","title":"Account Type"}},{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account 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}/provider":{"patch":{"tags":["agents"],"summary":"Update Provider","description":"Set or update the agent's provider config.\n\nConfig updates are MERGED with the existing config (PATCH semantics\non the inner dict — fields present overwrite, missing fields are\npreserved). To clear a key explicitly, send it as `null`.\n\nSwitching `provider` requires re-validating the WHOLE merged config\nagainst the new transport. We refuse the change if validation fails\nso an agent never ends up holding a config blob the new transport\ncan't even parse.\n\nRe-runs healthcheck when `revalidate=True`.","operationId":"update_provider_api_agents__agent_id__provider_patch","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_ProviderConfigBody"}}}},"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}/provider/healthcheck":{"post":{"tags":["agents"],"summary":"Healthcheck Provider","description":"Hit the LLM endpoint with a tiny probe to validate auth + shape.","operationId":"healthcheck_provider_api_agents__agent_id__provider_healthcheck_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/agents/{agent_id}/provider-config":{"get":{"tags":["agents"],"summary":"Get Provider Config","description":"Return the agent's provider config, credential-redacted, so a config\nform can prefill the current selection on edit (instead of starting\nblank). Secrets (api_key, AWS secret, …) come back masked via\nredact_for_display; the Gemini config carries only identifiers.","operationId":"get_provider_config_api_agents__agent_id__provider_config_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/{agent_id}/reset-conversations":{"post":{"tags":["agents"],"summary":"Reset Conversations","description":"Drop every provider session cached for this agent.\n\nPowers the dashboard \"Reset conversations\" button — one click flushes\nthe agent's memory of every peer it's been talking to (1 agent = 1\npersona = 1 reset surface).","operationId":"reset_conversations_api_agents__agent_id__reset_conversations_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/agents/{agent_id}/internal-bearer":{"get":{"tags":["agents"],"summary":"Get Internal Bearer Endpoint","description":"Return the agent's internal bearer (plaintext).\n\nSurfaces the chmd_* bearer the agent's MCP server connection is\nauthenticated with — used by providers that don't auto-inject\n(Gemini, Bedrock) so the user can paste it into their own\nruntime code. Providers with native MCP-as-tool support\n(Anthropic Managed Agents, OpenAI Responses, Foundry, Mistral)\nconsume it server-side via auto-injection.\n\nMints the bearer lazily on first call. Repeated calls return the\nsame bearer until /rotate is invoked.","operationId":"get_internal_bearer_endpoint_api_agents__agent_id__internal_bearer_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/{agent_id}/internal-bearer/rotate":{"post":{"tags":["agents"],"summary":"Rotate Internal Bearer Endpoint","description":"Revoke the current internal bearer + mint a fresh one.\n\nFor providers that bake the bearer into a server-side artifact\n(Anthropic Managed Agents stores it in\n`agent_toolset.mcp_servers[].authorization_token`), the agent's\nprovider config also needs to be invalidated so the next\nhandle_event recreates the provider-side agent with the new bearer.\nWe do that for Anthropic by clearing `config.agent_id` here.","operationId":"rotate_internal_bearer_endpoint_api_agents__agent_id__internal_bearer_rotate_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/agents/{agent_id}/identity-auth":{"get":{"tags":["agents"],"summary":"Get Identity Auth","description":"Identity-based MCP auth surface for this agent.\n\nReturns the agent's MCP audience (what the runtime mints its OIDC ID\ntoken `aud` as), the MCP endpoint URL, the trusted issuers, the\ncurrent SA-identity allowlist, and the provisioned per-engine signing\nkeys. The runtime authenticates with its own OIDC identity token or a\nhandshake-provisioned key — no `chmd_*` bearer is baked in, and\nre-association needs no redeploy.","operationId":"get_identity_auth_api_agents__agent_id__identity_auth_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/{agent_id}/identities":{"post":{"tags":["agents"],"summary":"Add Agent Identity","description":"Register an authorized runtime identity for the identity-based MCP\nauth path. `identity` is the runtime's service-account email (or its\n`sub` unique id); `issuer` is the trusted issuer (default 'google').","operationId":"add_agent_identity_api_agents__agent_id__identities_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/_AddIdentityBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["agents"],"summary":"Remove Agent Identity","description":"Revoke a previously-registered runtime identity. Once removed, the\nnext token from that identity is rejected (subject to the verifier's\nJWKS/token caches, which are short-lived).","operationId":"remove_agent_identity_api_agents__agent_id__identities_delete","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"identity","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Identity"}},{"name":"issuer","in":"query","required":false,"schema":{"type":"string","default":"google","title":"Issuer"}}],"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}/test":{"post":{"tags":["agents"],"summary":"Fire Test Event","description":"Enqueue a synthetic `agent.test` delivery on this agent.\n\nThe payload doesn't carry a `reply_token` — there's no real thread\nto reply to. The agent's handler should treat `agent.test` as a\nhealth probe.","operationId":"fire_test_event_api_agents__agent_id__test_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/agents/{agent_id}/deliveries":{"get":{"tags":["agents"],"summary":"List Deliveries","description":"Paginated delivery history for an agent, newest first.","operationId":"list_deliveries_api_agents__agent_id__deliveries_get","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"before_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Before Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/google/connect":{"get":{"tags":["agents"],"summary":"Google Oauth Connect","description":"Redirect to Google's consent screen, binding the token to `agent_id`.","operationId":"google_oauth_connect_api_agents_google_connect_get","parameters":[{"name":"agent_id","in":"query","required":true,"schema":{"type":"string","minLength":1,"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/google/callback":{"get":{"tags":["agents"],"summary":"Google Oauth Callback","description":"Land back from Google with `code` (or `error`), exchange + store.","operationId":"google_oauth_callback_api_agents_google_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/google/status":{"get":{"tags":["agents"],"summary":"Google Oauth Status","operationId":"google_oauth_status_api_agents_google_status_get","parameters":[{"name":"agent_id","in":"query","required":true,"schema":{"type":"string","minLength":1,"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/google/disconnect":{"post":{"tags":["agents"],"summary":"Google Oauth Disconnect","operationId":"google_oauth_disconnect_api_agents_google_disconnect_post","parameters":[{"name":"agent_id","in":"query","required":true,"schema":{"type":"string","minLength":1,"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/google/wif-info":{"get":{"tags":["agents"],"summary":"Gemini Wif Info","description":"Setup info for Gemini Workload Identity Federation auth_mode.\n\nThe OIDC `sub` Chamade stamps is the *agent id* (one principal per\nagent → two agents can federate two Google accounts). The user grants\nthe target SA `roles/iam.workloadIdentityUser` scoped to that subject.\nMirrors the Bedrock trust-policy helper, but for GCP.","operationId":"gemini_wif_info_api_agents_google_wif_info_get","parameters":[{"name":"agent_id","in":"query","required":true,"schema":{"type":"string","minLength":1,"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/google/wif-autosetup":{"post":{"tags":["agents"],"summary":"Gemini Wif Autosetup","description":"One-click WIF provisioning on the user's GCP project, for this agent.\n\nUses the agent's connected Google OAuth token (cloud-platform scope,\ngranted at step 1) to create the pool / OIDC provider / SA / role\nbindings, binding the workloadIdentityUser grant to this agent's OIDC\nsubject, then returns the four wif_* values. Idempotent — safe to click\ntwice. 409 if Google isn't connected; 400 (friendly) if no IAM-admin.","operationId":"gemini_wif_autosetup_api_agents_google_wif_autosetup_post","parameters":[{"name":"agent_id","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Agent Id"}},{"name":"project","in":"query","required":true,"schema":{"type":"string","minLength":4,"title":"Project"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/google/wif-ready":{"get":{"tags":["agents"],"summary":"Gemini Wif Ready","description":"Is the agent's WIF impersonation working yet? (Polled by the wizard\nwhile a freshly-created IAM binding propagates — seconds to ~2 min.)","operationId":"gemini_wif_ready_api_agents_google_wif_ready_get","parameters":[{"name":"agent_id","in":"query","required":true,"schema":{"type":"string","minLength":1,"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/google/projects":{"get":{"tags":["agents"],"summary":"Google List Projects","description":"List GCP projects the agent's connected Google identity can access.","operationId":"google_list_projects_api_agents_google_projects_get","parameters":[{"name":"agent_id","in":"query","required":true,"schema":{"type":"string","minLength":1,"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/google/reasoning-engines":{"get":{"tags":["agents"],"summary":"Google List Reasoning Engines","description":"List deployed Reasoning Engines in (project, location).","operationId":"google_list_reasoning_engines_api_agents_google_reasoning_engines_get","parameters":[{"name":"agent_id","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Agent Id"}},{"name":"project","in":"query","required":true,"schema":{"type":"string","minLength":4,"maxLength":64,"title":"Project"}},{"name":"location","in":"query","required":false,"schema":{"type":"string","minLength":2,"maxLength":32,"default":"us-central1","title":"Location"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/azure/connect":{"get":{"tags":["agents"],"summary":"Azure Oauth Connect","description":"Redirect to Entra's consent screen, binding the token to `agent_id`.","operationId":"azure_oauth_connect_api_agents_azure_connect_get","parameters":[{"name":"agent_id","in":"query","required":true,"schema":{"type":"string","minLength":1,"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/azure/callback":{"get":{"tags":["agents"],"summary":"Azure Oauth Callback","description":"Land back from Entra with `code` (or `error`), exchange + store.","operationId":"azure_oauth_callback_api_agents_azure_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"}},{"name":"error_description","in":"query","required":false,"schema":{"type":"string","default":"","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/agents/azure/status":{"get":{"tags":["agents"],"summary":"Azure Oauth Status","operationId":"azure_oauth_status_api_agents_azure_status_get","parameters":[{"name":"agent_id","in":"query","required":true,"schema":{"type":"string","minLength":1,"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/azure/disconnect":{"post":{"tags":["agents"],"summary":"Azure Oauth Disconnect","operationId":"azure_oauth_disconnect_api_agents_azure_disconnect_post","parameters":[{"name":"agent_id","in":"query","required":true,"schema":{"type":"string","minLength":1,"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/azure/accounts":{"get":{"tags":["agents"],"summary":"Azure List Accounts","description":"List the user's AIServices Cognitive Services accounts across all\nenabled subscriptions (ARM). Each carries a region-support flag for the\nResponses API so the picker can warn before the user commits.","operationId":"azure_list_accounts_api_agents_azure_accounts_get","parameters":[{"name":"agent_id","in":"query","required":true,"schema":{"type":"string","minLength":1,"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/azure/projects":{"get":{"tags":["agents"],"summary":"Azure List Projects","description":"List the AIServices account's projects (ARM sub-resource).\n\n`account` is the full ARM resource id returned by /azure/accounts.","operationId":"azure_list_projects_api_agents_azure_projects_get","parameters":[{"name":"agent_id","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Agent Id"}},{"name":"account","in":"query","required":true,"schema":{"type":"string","minLength":8,"title":"Account"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/azure/agents":{"get":{"tags":["agents"],"summary":"Azure List Agents","description":"List a project's hosted agents (Foundry data plane).\n\nUses the ai.azure.com token — DISTINCT from the ARM token. Requires the\n**Foundry User** role on the project; a 401/403 surfaces that hint.","operationId":"azure_list_agents_api_agents_azure_agents_get","parameters":[{"name":"agent_id","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Agent Id"}},{"name":"account","in":"query","required":true,"schema":{"type":"string","minLength":8,"title":"Account"}},{"name":"project","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"title":"Project"}}],"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}/azure/configure":{"post":{"tags":["agents"],"summary":"Azure Configure Agent","description":"Pick a Foundry agent → build the openai_responses config server-side.\n\nFetches the account key via ARM `listKeys` (kept server-side — never sent\nto the browser), builds the project-level Responses endpoint URL +\n`agent_reference`, and stores the config via the shared provider-update\npath (validate + healthcheck). No endpoint/key pasted by hand.\n\nWire shape (verified live 2026-05-30): a hosted agent is invoked at the\nPROJECT-level `…/openai/responses?api-version=…` with an `agent_reference`\nin the body — NOT the per-agent `…/agents/{id}/endpoint/…` URL (that\nrejects every api-version). The transport injects `agent_reference` and\ndrops `model` for these configs.","operationId":"azure_configure_agent_api_agents__agent_id__azure_configure_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/_AzureConfigureBody"}}}},"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}/mistral/agents":{"post":{"tags":["agents"],"summary":"Mistral List Agents","description":"List the user's existing Mistral Agents (`GET /v1/agents`) for the picker.\n\nMistral auth is a bare API key — no OAuth — so the key the user just typed\ninto the form is POSTed here (never a query string, never logged) to\nenumerate `ag_*` agents. When editing an already-configured agent the key\nfield is left blank; we fall back to the stored config key so browsing\ndoesn't force a re-paste.","operationId":"mistral_list_agents_api_agents__agent_id__mistral_agents_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/_MistralBrowseBody"}}}},"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}/anthropic/agents":{"post":{"tags":["agents"],"summary":"Anthropic List Agents","description":"List the user's existing Anthropic Managed Agents for the picker.\n\nAnthropic auth is a bare API key (no third-party OAuth — banned in 2026),\nso the key the user just typed into the form is POSTed here (never a query\nstring, never logged) to enumerate `agent_*` agents via `GET /v1/agents`.\nWhen editing an already-configured agent the key field is left blank; we\nfall back to the stored config key so browsing doesn't force a re-paste.\n\nPicking an existing agent means its model + instructions live on the\nAnthropic side — Chamade folds its XML action-convention system prompt\ninto the first message of each session (see the transport's `picked`\npath), and never recreates the agent.","operationId":"anthropic_list_agents_api_agents__agent_id__anthropic_agents_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/_MistralBrowseBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/bedrock/oidc-info":{"get":{"tags":["agents"],"summary":"Bedrock Oidc Info","description":"Return the OIDC issuer URL + a copy-paste-ready trust policy for the\nuser's IAM role, scoped to *this* user only via `sub` StringEquals.","operationId":"bedrock_oidc_info_api_agents_bedrock_oidc_info_get","parameters":[{"name":"aws_account_id","in":"query","required":true,"schema":{"type":"string","minLength":12,"maxLength":12,"title":"Aws Account 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}/agentcore/trust-info":{"get":{"tags":["agents"],"summary":"Agentcore Trust Info","description":"Setup info for the AgentCore assume-role flow.\n\nReturns the Chamade principal ARN + the user's **per-user** ExternalId\n(one role serves all their agents) + copy-paste trust/permission policies,\na one-click `launch_stack_url` (when the CFN template is hosted), and any\n`existing_role_arn` the user already set up (so a 2nd agent skips the role\ncreation). 503 when the Chamade AWS principal isn't configured.","operationId":"agentcore_trust_info_api_agents__agent_id__agentcore_trust_info_get","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"region","in":"query","required":false,"schema":{"type":"string","default":"us-east-1","title":"Region"}}],"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}/agentcore/runtimes":{"post":{"tags":["agents"],"summary":"Agentcore List Runtimes","description":"Browse the customer's AgentCore runtimes for the picker.\n\nAssumes the pasted role (with this agent's ExternalId) and calls\nListAgentRuntimes. Returns [{arn, id, name, status}].","operationId":"agentcore_list_runtimes_api_agents__agent_id__agentcore_runtimes_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/_AgentCoreBrowseBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent-runtime/status":{"post":{"tags":["agent-runtime"],"summary":"Post Runtime Status","description":"Record the calling runtime's busy/idle transition + activity line.\n\nAuth is any active bearer (X-API-Key); the emitting agent is resolved\nfrom the bearer's memberships with the same rule as agent-to-agent\nsends (exactly one agent, otherwise 400).","operationId":"post_runtime_status_api_agent_runtime_status_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuntimeStatusRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent-deliveries/{delivery_id}":{"get":{"tags":["agents"],"summary":"Get Delivery","description":"Fetch full delivery detail including payload + last response body.","operationId":"get_delivery_api_agent_deliveries__delivery_id__get","parameters":[{"name":"delivery_id","in":"path","required":true,"schema":{"type":"integer","title":"Delivery Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent-deliveries/{delivery_id}/replay":{"post":{"tags":["agents"],"summary":"Replay Delivery","description":"Reset a delivery to `pending, attempts=0, due now`.","operationId":"replay_delivery_api_agent_deliveries__delivery_id__replay_post","parameters":[{"name":"delivery_id","in":"path","required":true,"schema":{"type":"integer","title":"Delivery Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/.well-known/openid-configuration":{"get":{"tags":["agents-oidc"],"summary":"Oidc Discovery","description":"Public OIDC discovery document — fetched by AWS STS at config time.","operationId":"oidc_discovery__well_known_openid_configuration_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/jwks.json":{"get":{"tags":["agents-oidc"],"summary":"Oidc Jwks","description":"Public signing keys — fetched by AWS STS to verify our JWTs.","operationId":"oidc_jwks__well_known_jwks_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/engine-keys/enroll":{"post":{"tags":["agents"],"summary":"Enroll Engine Key","description":"Deploy-time handshake authenticated to the owning Chamade account.\n\nThe engine identifies itself by its `engine_resource` (its Vertex\nresource name): the deploy generates the keypair, bakes the private key\ninto its own env, and registers the **public** key here under that\nresource, PENDING and owned by this account. The key is rejected at call time until the operator\npicks this engine while creating an agent, which links it. Chamade never\nsees the private key. A settings key may be used by deployment automation;\npending keys can only be linked to agents of the same account.","operationId":"enroll_engine_key_api_engine_keys_enroll_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_EnrollEngineKeyBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/engine-keys/{kid}":{"delete":{"tags":["agents"],"summary":"Revoke My Engine Key","description":"Revoke a key linked to one of your agents — tokens signed with it\nstop verifying immediately, no redeploy needed.","operationId":"revoke_my_engine_key_api_engine_keys__kid__delete","parameters":[{"name":"kid","in":"path","required":true,"schema":{"type":"string","title":"Kid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/talk/sessions":{"post":{"tags":["talk"],"summary":"Create Talk Session","description":"Create a talk call for one agent and mint the browser's LiveKit token.","operationId":"create_talk_session_api_talk_sessions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTalkSessionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/talk":{"get":{"tags":["talk"],"summary":"Talk Page","description":"The talk-to-agent call page (served as talk.{dev.,}chamade.io/).","operationId":"talk_page_talk_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/agents/{agent_id}/avatar":{"get":{"tags":["talk"],"summary":"Get Avatar","operationId":"get_avatar_api_agents__agent_id__avatar_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"}}}}}},"put":{"tags":["talk"],"summary":"Put Avatar","operationId":"put_avatar_api_agents__agent_id__avatar_put","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvatarUpdateRequest"}}}},"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}/avatar/preview":{"post":{"tags":["talk"],"summary":"Avatar Preview","description":"Proxy one preview frame from maquisard-render — the browser never\nre-implements the rig, so the preview IS what the call will show.","operationId":"avatar_preview_api_agents__agent_id__avatar_preview_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/AvatarPreviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/a2a/{handle}/.well-known/agent-card.json":{"get":{"tags":["a2a"],"summary":"Agent Card","operationId":"agent_card_a2a__handle___well_known_agent_card_json_get","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/a2a/{handle}/card":{"get":{"tags":["a2a"],"summary":"Agent Card Alias","operationId":"agent_card_alias_a2a__handle__card_get","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/a2a/{handle}":{"post":{"tags":["a2a"],"summary":"A2A Rpc","operationId":"a2a_rpc_a2a__handle__post","parameters":[{"name":"handle","in":"path","required":true,"schema":{"type":"string","title":"Handle"}}],"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}/a2a":{"get":{"tags":["a2a"],"summary":"Get A2A Config","operationId":"get_a2a_config_api_agents__agent_id__a2a_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"}}}}}},"post":{"tags":["a2a"],"summary":"Set A2A Config","operationId":"set_a2a_config_api_agents__agent_id__a2a_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/_A2AEnableBody"}}}},"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}/a2a/tokens":{"post":{"tags":["a2a"],"summary":"Mint A2A Token","operationId":"mint_a2a_token_api_agents__agent_id__a2a_tokens_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/_A2ATokenBody"}}}},"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}/a2a/tokens/{token_id}":{"delete":{"tags":["a2a"],"summary":"Revoke A2A Token","operationId":"revoke_a2a_token_api_agents__agent_id__a2a_tokens__token_id__delete","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"token_id","in":"path","required":true,"schema":{"type":"string","title":"Token Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agents/{agent_id}/a2a/peers":{"post":{"tags":["a2a"],"summary":"Add A2A Peer","operationId":"add_a2a_peer_api_agents__agent_id__a2a_peers_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/_A2APeerBody"}}}},"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}/a2a/peers/{peer_id}":{"delete":{"tags":["a2a"],"summary":"Delete A2A Peer","operationId":"delete_a2a_peer_api_agents__agent_id__a2a_peers__peer_id__delete","parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}},{"name":"peer_id","in":"path","required":true,"schema":{"type":"string","title":"Peer Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mcp-auth/consent":{"get":{"tags":["mcp_oauth_consent"],"summary":"Consent Get","operationId":"consent_get_mcp_auth_consent_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"tags":["mcp_oauth_consent"],"summary":"Consent Post","operationId":"consent_post_mcp_auth_consent_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_consent_post_mcp_auth_consent_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hermes/logs":{"get":{"summary":"Hermes Log Read","operationId":"hermes_log_read_api_hermes_logs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Hermes Log Sink","operationId":"hermes_log_sink_api_hermes_logs_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ready":{"get":{"summary":"Ready","operationId":"ready_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Ready","operationId":"ready_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/metrics":{"get":{"summary":"Metrics","operationId":"metrics_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboard":{"get":{"summary":"Dashboard Page","operationId":"dashboard_page_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboard/agents":{"get":{"summary":"Dashboard Agents Page","operationId":"dashboard_agents_page_dashboard_agents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboard/keys":{"get":{"summary":"Dashboard Keys Legacy","operationId":"dashboard_keys_legacy_dashboard_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboard/platforms":{"get":{"summary":"Dashboard Platforms Page","operationId":"dashboard_platforms_page_dashboard_platforms_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboard/voice":{"get":{"summary":"Dashboard Voice Page","operationId":"dashboard_voice_page_dashboard_voice_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboard/account":{"get":{"summary":"Dashboard Account Page","operationId":"dashboard_account_page_dashboard_account_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/login":{"get":{"summary":"Login Page","operationId":"login_page_login_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/signup":{"get":{"summary":"Signup Page","operationId":"signup_page_signup_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/forgot-password":{"get":{"summary":"Forgot Password Page","operationId":"forgot_password_page_forgot_password_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/legal":{"get":{"summary":"Legal Page","operationId":"legal_page_legal_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/privacy":{"get":{"summary":"Privacy Page","operationId":"privacy_page_privacy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/support":{"get":{"summary":"Support Page","operationId":"support_page_support_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Support Submit","operationId":"support_submit_support_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/download/teams-app":{"get":{"summary":"Download Teams App","operationId":"download_teams_app_download_teams_app_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/teams-review":{"get":{"summary":"Teams Review Instructions","operationId":"teams_review_instructions_teams_review_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/teams/about":{"get":{"summary":"Teams About Page","operationId":"teams_about_page_teams_about_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/docs":{"get":{"summary":"Docs Index","operationId":"docs_index_docs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Docs Index","operationId":"docs_index_docs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/docs/{page}":{"get":{"summary":"Docs Page","operationId":"docs_page_docs__page__get","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":"string","title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"head":{"summary":"Docs Page","operationId":"docs_page_docs__page__get","parameters":[{"name":"page","in":"path","required":true,"schema":{"type":"string","title":"Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/llms.txt":{"get":{"summary":"Llms Txt","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/llms-setup.txt":{"get":{"summary":"Llms Setup Txt","operationId":"llms_setup_txt_llms_setup_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/llms-full.txt":{"get":{"summary":"Llms Full Txt","operationId":"llms_full_txt_llms_full_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/dashboard/{path}":{"post":{"summary":"Legacy Dashboard Redirect","operationId":"legacy_dashboard_redirect_dashboard__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"}}}}}},"patch":{"summary":"Legacy Dashboard Redirect","operationId":"legacy_dashboard_redirect_dashboard__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"}}}}}},"put":{"summary":"Legacy Dashboard Redirect","operationId":"legacy_dashboard_redirect_dashboard__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"}}}}}},"delete":{"summary":"Legacy Dashboard Redirect","operationId":"legacy_dashboard_redirect_dashboard__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":{"summary":"Legacy Dashboard Redirect","operationId":"legacy_dashboard_redirect_dashboard__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":{"summary":"Landing","operationId":"landing__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AddByotDidRequest":{"properties":{"phone_number":{"type":"string","title":"Phone Number"},"label":{"type":"string","maxLength":100,"title":"Label","default":""}},"type":"object","required":["phone_number"],"title":"AddByotDidRequest"},"AvatarPreviewRequest":{"properties":{"config":{"additionalProperties":true,"type":"object","title":"Config","default":{}},"pose":{"type":"string","title":"Pose","default":"neutral"}},"type":"object","title":"AvatarPreviewRequest"},"AvatarUpdateRequest":{"properties":{"style":{"type":"string","title":"Style","default":"cartoon"},"config":{"additionalProperties":true,"type":"object","title":"Config","default":{}}},"type":"object","title":"AvatarUpdateRequest"},"Body_consent_post_mcp_auth_consent_post":{"properties":{"request_id":{"type":"string","title":"Request Id"},"decision":{"type":"string","title":"Decision"},"account_ref":{"items":{"type":"string"},"type":"array","title":"Account Ref","default":[]}},"type":"object","required":["request_id","decision"],"title":"Body_consent_post_mcp_auth_consent_post"},"Body_fill_reserved_upload_endpoint_api_files_u__token__post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"}},"type":"object","title":"Body_fill_reserved_upload_endpoint_api_files_u__token__post"},"Body_nctalk_connect_approve_connect_nctalk_approve_post":{"properties":{"nc_state":{"type":"string","title":"Nc State"},"nc_url":{"type":"string","title":"Nc Url"},"origin":{"type":"string","title":"Origin","default":"nc_admin"},"decision":{"type":"string","title":"Decision","default":"approve"}},"type":"object","required":["nc_state","nc_url"],"title":"Body_nctalk_connect_approve_connect_nctalk_approve_post"},"Body_upload_file_api_files_post":{"properties":{"file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"File"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"mime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mime"}},"type":"object","title":"Body_upload_file_api_files_post"},"ByotDidSettingsRequest":{"properties":{"auto_answer":{"type":"boolean","title":"Auto Answer"}},"type":"object","required":["auto_answer"],"title":"ByotDidSettingsRequest"},"ChangeEmailRequest":{"properties":{"new_email":{"type":"string","format":"email","title":"New Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["new_email","password"],"title":"ChangeEmailRequest"},"ChangePasswordRequest":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"ChangePasswordRequest"},"ChatRequest":{"properties":{"text":{"type":"string","maxLength":10000,"title":"Text","default":""},"sender_name":{"type":"string","maxLength":255,"title":"Sender Name","default":""},"attachments":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Attachments"},"encrypted":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Encrypted"}},"type":"object","title":"ChatRequest"},"ConnectTrunkRequest":{"properties":{"sip_host":{"type":"string","maxLength":255,"title":"Sip Host"},"sip_port":{"type":"integer","maximum":65535.0,"minimum":1.0,"title":"Sip Port","default":5060},"sip_username":{"type":"string","maxLength":255,"title":"Sip Username"},"sip_password":{"type":"string","maxLength":255,"title":"Sip Password"},"sip_realm":{"type":"string","maxLength":255,"title":"Sip Realm","default":""},"sip_caller_id":{"type":"string","maxLength":64,"title":"Sip Caller Id","default":""}},"type":"object","required":["sip_host","sip_username","sip_password"],"title":"ConnectTrunkRequest"},"CreateBotTokenRequest":{"properties":{"platform":{"type":"string","title":"Platform"},"bot_token":{"type":"string","title":"Bot Token"},"discord_app_id":{"type":"string","title":"Discord App Id","default":""},"telegram_api_id":{"type":"integer","title":"Telegram Api Id","default":0},"telegram_api_hash":{"type":"string","title":"Telegram Api Hash","default":""},"slack_signing_secret":{"type":"string","title":"Slack Signing Secret","default":""},"matrix_homeserver":{"type":"string","title":"Matrix Homeserver","default":""}},"type":"object","required":["platform","bot_token"],"title":"CreateBotTokenRequest"},"CreateCallRequest":{"properties":{"platform":{"type":"string","title":"Platform","default":""},"meeting_url":{"type":"string","maxLength":2000,"title":"Meeting Url","default":""},"agent_name":{"type":"string","maxLength":255,"title":"Agent Name","default":"AI Agent"},"echo":{"type":"boolean","title":"Echo","default":false},"account_id":{"type":"string","maxLength":255,"title":"Account Id","default":""},"stt_voice_config_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stt Voice Config Id"},"tts_voice_config_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tts Voice Config Id"}},"type":"object","title":"CreateCallRequest"},"CreateConfigRequest":{"properties":{"kind":{"type":"string","pattern":"^(stt|tts)$","title":"Kind"},"provider":{"type":"string","title":"Provider"},"api_key":{"type":"string","title":"Api Key"},"label":{"type":"string","title":"Label","default":""},"options":{"additionalProperties":true,"type":"object","title":"Options"},"enabled":{"type":"boolean","title":"Enabled","default":true}},"type":"object","required":["kind","provider","api_key"],"title":"CreateConfigRequest"},"CreateKeyRequest":{"properties":{"name":{"type":"string","title":"Name","default":""}},"type":"object","title":"CreateKeyRequest"},"CreateTalkSessionRequest":{"properties":{"agent_id":{"type":"string","title":"Agent Id"}},"type":"object","required":["agent_id"],"title":"CreateTalkSessionRequest"},"DeleteAccountRequest":{"properties":{"password":{"type":"string","title":"Password","default":""}},"type":"object","title":"DeleteAccountRequest"},"DmChatRequest":{"properties":{"platform":{"type":"string","title":"Platform"},"text":{"type":"string","maxLength":10000,"title":"Text","default":""},"keep_typing":{"type":"boolean","title":"Keep Typing","default":false},"attachments":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Attachments"},"encrypted":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Encrypted"},"account_id":{"type":"string","maxLength":255,"title":"Account Id","default":""},"to":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"To"},"task":{"type":"string","maxLength":64,"title":"Task","default":""}},"type":"object","required":["platform"],"title":"DmChatRequest"},"DmTypingRequest":{"properties":{"platform":{"type":"string","title":"Platform"},"account_id":{"type":"string","maxLength":255,"title":"Account Id","default":""},"to":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"To"}},"type":"object","required":["platform"],"title":"DmTypingRequest"},"E2eeHeartbeatRequest":{"properties":{"platform":{"type":"string","title":"Platform"},"connection_id":{"type":"string","title":"Connection Id","default":""},"api_secret":{"type":"string","title":"Api Secret"},"capabilities":{"items":{"type":"string"},"type":"array","title":"Capabilities"},"e2ee_schemes":{"items":{"type":"string"},"type":"array","title":"E2Ee Schemes"},"stats":{"additionalProperties":true,"type":"object","title":"Stats"}},"type":"object","required":["platform","api_secret"],"title":"E2eeHeartbeatRequest","description":"Addon heartbeat — refresh capabilities + record E2EE activity stats.\n\nAuth: `api_secret` (in body) must match the addon's stored secret.\nEither `connection_id` is provided (targets exactly one connection)\nor it's omitted/empty (fan out to every active nctalk connection\nwhose stored api_secret matches — the common case, since the addon\nis per-NC-instance and doesn't know individual Chamade connection\nUUIDs). The shared secret already gates every addon→Chamade call\n(HMAC verification trait); reusing it here avoids a second credential."},"E2eeRelayRequest":{"properties":{"direction":{"type":"string","title":"Direction"},"target_platform":{"type":"string","title":"Target Platform","default":""},"payload":{"additionalProperties":true,"type":"object","title":"Payload"}},"type":"object","required":["direction","payload"],"title":"E2eeRelayRequest","description":"Opaque relay — placeholder in V1, wired when Matrix lands."},"FeedbackBody":{"properties":{"category":{"type":"string","title":"Category","default":"general"},"message":{"type":"string","title":"Message"},"page":{"type":"string","title":"Page","default":""},"surface":{"type":"string","title":"Surface","default":""},"provider":{"type":"string","title":"Provider","default":""},"error_detail":{"type":"string","title":"Error Detail","default":""},"suggestion_shown":{"type":"string","title":"Suggestion Shown","default":""}},"type":"object","required":["message"],"title":"FeedbackBody"},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ListVoicesRequest":{"properties":{"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"},"config_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Config Id"}},"type":"object","title":"ListVoicesRequest"},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"NcTalkCallbackRequest":{"properties":{"state":{"type":"string","title":"State"},"nc_url":{"type":"string","title":"Nc Url"},"bot_login":{"type":"string","title":"Bot Login"},"bot_password":{"type":"string","title":"Bot Password"},"api_secret":{"type":"string","title":"Api Secret"},"app_id":{"type":"string","title":"App Id","default":"chamade_talk"},"nc_username":{"type":"string","title":"Nc Username","default":""},"capabilities":{"items":{"type":"string"},"type":"array","title":"Capabilities"},"e2ee_schemes":{"items":{"type":"string"},"type":"array","title":"E2Ee Schemes"}},"type":"object","required":["state","nc_url","bot_login","bot_password","api_secret"],"title":"NcTalkCallbackRequest"},"NcTalkConnectRequest":{"properties":{"nc_url":{"type":"string","maxLength":2048,"title":"Nc Url"}},"type":"object","required":["nc_url"],"title":"NcTalkConnectRequest"},"OAuthStartRequest":{"properties":{"connection_id":{"type":"string","title":"Connection Id","default":""}},"type":"object","title":"OAuthStartRequest"},"ResetPasswordRequest":{"properties":{"token":{"type":"string","title":"Token"},"password":{"type":"string","title":"Password"}},"type":"object","required":["token","password"],"title":"ResetPasswordRequest"},"RuntimeStatusRequest":{"properties":{"state":{"type":"string","title":"State"},"activity":{"type":"string","title":"Activity","default":""}},"type":"object","required":["state"],"title":"RuntimeStatusRequest"},"SayRequest":{"properties":{"text":{"type":"string","maxLength":10000,"minLength":1,"title":"Text"}},"type":"object","required":["text"],"title":"SayRequest"},"SendRequest":{"properties":{"conversation_id":{"type":"string","title":"Conversation Id"},"text":{"type":"string","maxLength":10000,"title":"Text"},"meta":{"type":"boolean","title":"Meta","default":false}},"type":"object","required":["conversation_id","text"],"title":"SendRequest"},"ShimStatusRequest":{"properties":{"platform":{"type":"string","title":"Platform"},"scheme":{"type":"string","title":"Scheme","default":"sealed-box-x25519"},"peer_configured":{"type":"boolean","title":"Peer Configured","default":false},"last_encrypt_ok_at":{"type":"integer","title":"Last Encrypt Ok At","default":0},"last_decrypt_ok_at":{"type":"integer","title":"Last Decrypt Ok At","default":0}},"type":"object","required":["platform"],"title":"ShimStatusRequest","description":"Shim heartbeat carrying `peer_configured` + last encrypt/decrypt times.\n\nShipped over the authenticated API surface (not the channel) for V1\nso the dashboard has a pull-able endpoint without needing the hosted\nHTTP MCP to forward channel notifications."},"SignupRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"invite_code":{"type":"string","title":"Invite Code","default":""}},"type":"object","required":["email","password"],"title":"SignupRequest"},"TeamsAdminConsentStartRequest":{"properties":{"connection_id":{"type":"string","title":"Connection Id"}},"type":"object","required":["connection_id"],"title":"TeamsAdminConsentStartRequest"},"TestAgentStartRequest":{"properties":{"agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Id"}},"type":"object","title":"TestAgentStartRequest"},"TypingRequest":{"properties":{"conversation_id":{"type":"string","title":"Conversation Id"}},"type":"object","required":["conversation_id"],"title":"TypingRequest"},"UpdateConfigRequest":{"properties":{"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"options":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Options"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"type":"object","title":"UpdateConfigRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"_A2AEnableBody":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"_A2AEnableBody"},"_A2APeerBody":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"url":{"type":"string","maxLength":2048,"minLength":1,"title":"Url"},"bearer":{"anyOf":[{"type":"string","maxLength":4096},{"type":"null"}],"title":"Bearer"}},"type":"object","required":["name","url"],"title":"_A2APeerBody"},"_A2ATokenBody":{"properties":{"label":{"type":"string","maxLength":120,"title":"Label","default":""}},"type":"object","title":"_A2ATokenBody"},"_AddIdentityBody":{"properties":{"identity":{"type":"string","maxLength":320,"minLength":1,"title":"Identity"},"issuer":{"type":"string","maxLength":64,"title":"Issuer","default":"google"},"label":{"type":"string","maxLength":120,"title":"Label","default":""}},"type":"object","required":["identity"],"title":"_AddIdentityBody"},"_AgentCoreBrowseBody":{"properties":{"region":{"type":"string","maxLength":64,"minLength":2,"title":"Region"},"aws_role_arn":{"type":"string","maxLength":2048,"minLength":20,"title":"Aws Role Arn"}},"type":"object","required":["region","aws_role_arn"],"title":"_AgentCoreBrowseBody"},"_AttachAccountBody":{"properties":{"account_type":{"type":"string","pattern":"^(connection|bot_token|sip_number)$","title":"Account Type"},"account_id":{"type":"string","minLength":1,"title":"Account Id"}},"type":"object","required":["account_type","account_id"],"title":"_AttachAccountBody"},"_AzureConfigureBody":{"properties":{"account":{"type":"string","minLength":8,"title":"Account"},"project":{"type":"string","maxLength":128,"minLength":1,"title":"Project"},"agent_name":{"type":"string","maxLength":256,"minLength":1,"title":"Agent Name"},"model":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Model"},"event_filter":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Event Filter"},"system_prompt":{"anyOf":[{"type":"string","maxLength":32000},{"type":"null"}],"title":"System Prompt"}},"type":"object","required":["account","project","agent_name"],"title":"_AzureConfigureBody"},"_CreateAgentBody":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"_CreateAgentBody"},"_EnrollEngineKeyBody":{"properties":{"kid":{"type":"string","maxLength":128,"minLength":4,"title":"Kid"},"engine_resource":{"type":"string","maxLength":512,"minLength":1,"title":"Engine Resource"},"public_key_pem":{"type":"string","maxLength":8192,"minLength":1,"title":"Public Key Pem"},"label":{"type":"string","maxLength":120,"title":"Label","default":""}},"type":"object","required":["kid","engine_resource","public_key_pem"],"title":"_EnrollEngineKeyBody"},"_MistralBrowseBody":{"properties":{"api_key":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Api Key"},"endpoint_url":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Endpoint Url"}},"type":"object","title":"_MistralBrowseBody"},"_ProviderConfigBody":{"properties":{"provider":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Provider"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"system_prompt":{"anyOf":[{"type":"string","maxLength":32000},{"type":"null"}],"title":"System Prompt"},"event_filter":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Event Filter"},"revalidate":{"type":"boolean","title":"Revalidate","default":false}},"type":"object","title":"_ProviderConfigBody"},"_RenameAgentBody":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"_RenameAgentBody"},"_ReplyCallChatBody":{"properties":{"text":{"type":"string","maxLength":10000,"title":"Text","default":""},"sender_name":{"type":"string","maxLength":255,"title":"Sender Name","default":""},"attachments":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Attachments"},"encrypted":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Encrypted"}},"type":"object","title":"_ReplyCallChatBody"},"_ReplyCallSayBody":{"properties":{"text":{"type":"string","maxLength":10000,"minLength":1,"title":"Text"}},"type":"object","required":["text"],"title":"_ReplyCallSayBody"},"_ReplyDmBody":{"properties":{"text":{"type":"string","maxLength":10000,"title":"Text","default":""},"keep_typing":{"type":"boolean","title":"Keep Typing","default":false},"attachments":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Attachments"},"encrypted":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Encrypted"}},"type":"object","title":"_ReplyDmBody"},"_ReserveUploadRequest":{"properties":{"name":{"type":"string","title":"Name","default":"file"},"mime":{"type":"string","title":"Mime","default":"application/octet-stream"}},"type":"object","title":"_ReserveUploadRequest"},"_SetStatusBody":{"properties":{"status":{"type":"string","pattern":"^(active|disabled)$","title":"Status"}},"type":"object","required":["status"],"title":"_SetStatusBody"}}}}