{"openapi":"3.1.0","info":{"title":"Azure Governance Platform","description":"\n    **Azure Multi-Tenant Governance Platform**\n\n    A comprehensive platform for managing Azure governance across multiple tenants.\n\n    ## Key Features\n\n    * **Cost Management** - Track, analyze, and optimize Azure spending across tenants\n    * **Compliance Monitoring** - Continuous compliance assessment with CIS, ISO 27001, SOC 2, and custom frameworks\n    * **Resource Management** - Inventory and lifecycle management for Azure resources\n    * **Identity Governance** - MFA tracking, access reviews, and identity hygiene\n    * **Riverside Compliance** - Specialized tracking for Riverside Company requirements\n    * **DMARC Monitoring** - Email security posture monitoring\n\n    ## Authentication\n\n    The API supports multiple authentication methods:\n\n    1. **OAuth 2.0 / OpenID Connect** via Azure AD (recommended)\n    2. **Bearer Token** (JWT) for API access\n    3. **API Key** for service-to-service calls\n\n    See the authentication endpoints for details on obtaining tokens.\n\n    ## Rate Limiting\n\n    API requests are rate-limited to ensure fair usage:\n    - Default: 100 requests per minute per client\n    - Auth endpoints: 10 requests per minute\n    - Sync endpoints: 5 concurrent requests\n\n    Rate limit headers are included in all responses:\n    - `X-RateLimit-Limit`: Maximum requests allowed\n    - `X-RateLimit-Remaining`: Requests remaining in window\n    - `X-RateLimit-Reset`: Unix timestamp when limit resets\n\n    ## Security\n\n    All API endpoints are protected with:\n    - TLS 1.3 encryption in transit\n    - Security headers (CSP, HSTS, X-Frame-Options)\n    - Input validation and sanitization\n    - Audit logging for sensitive operations\n\n    ## Response Codes\n\n    | Code | Meaning | Description |\n    |------|---------|-------------|\n    | 200 | OK | Request succeeded |\n    | 201 | Created | Resource created successfully |\n    | 400 | Bad Request | Invalid request parameters |\n    | 401 | Unauthorized | Authentication required |\n    | 403 | Forbidden | Insufficient permissions |\n    | 404 | Not Found | Resource does not exist |\n    | 409 | Conflict | Resource conflict (e.g., duplicate) |\n    | 429 | Too Many Requests | Rate limit exceeded |\n    | 500 | Internal Error | Server-side error |\n\n    ## Support\n\n    For API support, contact the Cloud Governance Team or visit:\n    [Documentation](https://github.com/tygranlund/azure-governance-platform/tree/main/docs)\n    ","contact":{"name":"Cloud Governance Team","email":"cloud-governance@example.com"},"license":{"name":"MIT","url":"https://github.com/tygranlund/azure-governance-platform/blob/main/LICENSE"},"version":"2.5.0"},"paths":{"/metrics":{"get":{"summary":"Metrics","description":"Endpoint that serves Prometheus metrics.","operationId":"metrics_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/audit-logs":{"get":{"tags":["audit-logs"],"summary":"List Audit Logs","description":"List audit log entries with optional filters.\n\nReturns paginated audit log entries ordered by timestamp descending.\nRequires authentication. Admin users see all entries; standard users\nsee only their own entries (filtered by actor_id = current user).","operationId":"list_audit_logs_api_v1_audit_logs_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"actor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by actor user ID","title":"Actor Id"},"description":"Filter by actor user ID"},{"name":"actor_email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by actor email","title":"Actor Email"},"description":"Filter by actor email"},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Exact action match (e.g. auth.login.success)","title":"Action"},"description":"Exact action match (e.g. auth.login.success)"},{"name":"action_prefix","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Action prefix match (e.g. 'auth.')","title":"Action Prefix"},"description":"Action prefix match (e.g. 'auth.')"},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tenant UUID","title":"Tenant Id"},"description":"Filter by tenant UUID"},{"name":"resource_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by resource type","title":"Resource Type"},"description":"Filter by resource type"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status: success | failure | warning","title":"Status"},"description":"Filter by status: success | failure | warning"},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"ISO 8601 start datetime","title":"Since"},"description":"ISO 8601 start datetime"},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"ISO 8601 end datetime","title":"Until"},"description":"ISO 8601 end datetime"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Max records to return","default":100,"title":"Limit"},"description":"Max records to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Pagination offset","default":0,"title":"Offset"},"description":"Pagination offset"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Audit Logs Api V1 Audit Logs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/audit-logs/summary":{"get":{"tags":["audit-logs"],"summary":"Audit Log Summary","description":"Get audit log summary counts grouped by action category.","operationId":"audit_log_summary_api_v1_audit_logs_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Audit Log Summary Api V1 Audit Logs Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/resources/quotas":{"get":{"tags":["quotas"],"summary":"Get Quota Utilization","description":"Get Azure quota utilization for compute or network resources.\n\nReturns quota usage, limits, and health status (ok/warning/critical)\nfor the specified subscription and Azure region.\n\nWarning threshold: 75% — Critical threshold: 90%","operationId":"get_quota_utilization_api_v1_resources_quotas_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"subscription_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to a specific subscription ID","title":"Subscription Id"},"description":"Filter to a specific subscription ID"},{"name":"location","in":"query","required":false,"schema":{"type":"string","description":"Azure region to check quotas for","default":"eastus","title":"Location"},"description":"Azure region to check quotas for"},{"name":"provider","in":"query","required":false,"schema":{"type":"string","pattern":"^(compute|network)$","description":"Quota provider: compute | network","default":"compute","title":"Provider"},"description":"Quota provider: compute | network"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Quota Utilization Api V1 Resources Quotas Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/resources/quotas/summary":{"get":{"tags":["quotas"],"summary":"Get Quota Summary","description":"Get aggregated quota health summary across all managed subscriptions.","operationId":"get_quota_summary_api_v1_resources_quotas_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"location","in":"query","required":false,"schema":{"type":"string","default":"eastus","title":"Location"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Quota Summary Api V1 Resources Quotas Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["authentication"],"summary":"Login","description":"OAuth2 token endpoint for internal authentication.\n\nIn production/staging, direct login is disabled — all authentication\nflows go through Azure AD OAuth2. In development mode only, a\nrestricted dev credential pair is accepted.\n\nArgs:\n    form_data: OAuth2 username/password form\n\nReturns:\n    TokenResponse with access and refresh tokens","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_api_v1_auth_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/token":{"post":{"tags":["authentication"],"summary":"Token Endpoint","description":"OAuth2 token endpoint supporting multiple grant types.\n\nSupports:\n- authorization_code: Exchange auth code for tokens\n- refresh_token: Exchange refresh token for new access token\n\nArgs:\n    grant_type: OAuth2 grant type\n    code: Authorization code (for authorization_code grant)\n    refresh_token: Refresh token (for refresh_token grant)\n    redirect_uri: Redirect URI used in auth request\n    client_id: OAuth2 client ID\n    client_secret: OAuth2 client secret\n\nReturns:\n    TokenResponse with new tokens","operationId":"token_endpoint_api_v1_auth_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_token_endpoint_api_v1_auth_token_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/azure/login":{"get":{"tags":["authentication"],"summary":"Azure Login Redirect","description":"Get Azure AD OAuth2 authorization endpoint URL.\n\nReturns:\n    Dictionary with authorization URL and PKCE parameters","operationId":"azure_login_redirect_api_v1_auth_azure_login_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Azure Login Redirect Api V1 Auth Azure Login Get"}}}}}}},"/api/v1/auth/azure/callback":{"post":{"tags":["authentication"],"summary":"Azure Oauth Callback","description":"Handle Azure AD OAuth2 callback.\n\nExchanges authorization code for tokens and creates internal JWT tokens.\n\nArgs:\n    request: Authorization code and PKCE verifier\n\nReturns:\n    TokenResponse with internal access and refresh tokens","operationId":"azure_oauth_callback_api_v1_auth_azure_callback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AzureADLoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/me":{"get":{"tags":["authentication"],"summary":"Get Current User Info","description":"Get current user information.\n\nReturns:\n    UserInfoResponse with user details and accessible tenants","operationId":"get_current_user_info_api_v1_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserInfoResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/auth/refresh":{"post":{"tags":["authentication"],"summary":"Refresh Token Endpoint","description":"Refresh access token using refresh token.\n\nArgs:\n    request: Contains refresh token\n\nReturns:\n    TokenResponse with new access and refresh tokens","operationId":"refresh_token_endpoint_api_v1_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/logout":{"post":{"tags":["authentication"],"summary":"Logout","description":"Logout user and revoke tokens.\n\nIn a stateless JWT system, this is mainly for client-side cleanup.\nFor true revocation, implement a token blacklist.\n\nArgs:\n    request: FastAPI request\n    current_user: Authenticated user\n\nReturns:\n    LogoutResponse confirming logout","operationId":"logout_api_v1_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogoutResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/auth/health":{"get":{"tags":["authentication"],"summary":"Auth Health Check","description":"Check authentication system health.\n\nReturns:\n    Health status of auth components","operationId":"auth_health_check_api_v1_auth_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Auth Health Check Api V1 Auth Health Get"}}}}}}},"/api/v1/health":{"get":{"tags":["System"],"summary":"Api Health Check","description":"Get API health status.\n\nReturns the overall health status of the API and its dependencies.\nThis endpoint can be accessed without authentication for load balancer health checks,\nbut will include additional details when authenticated.\n\nReturns:\n    Health status including:\n    - API status (healthy/degraded/unhealthy)\n    - Version and environment info\n    - Database connectivity status\n    - Cache status\n    - Scheduler status\n    - Azure configuration status","operationId":"api_health_check_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Health Check Api V1 Health Get"}}}}}}},"/api/v1/health/detailed":{"get":{"tags":["System"],"summary":"Api Health Check Detailed","description":"Get detailed API health status with component metrics.\n\nThis endpoint provides more comprehensive health information including\ndetailed metrics for each component. Can be accessed without authentication\nbut some sensitive details may be redacted.\n\nReturns:\n    Detailed health status with metrics for all components.","operationId":"api_health_check_detailed_api_v1_health_detailed_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Api Health Check Detailed Api V1 Health Detailed Get"}}}}}}},"/api/v1/health/data":{"get":{"tags":["System"],"summary":"Data Freshness Check","description":"Per-tenant sync freshness across all data domains.\n\nReturns a mapping ``{tenant_key: {domain: iso8601 | null, ..., stale: bool}}``\nused by the UI header indicator to answer the question \"is data actually\nflowing?\" at a glance. A tenant is ``stale`` when any domain's most recent\n``synced_at`` is older than ``_get_data_freshness_threshold()`` (or missing).\n\nNo authentication required — returns no sensitive data, just timestamps\nand freshness booleans, so the unauthenticated app shell can render\nthe green/amber dot.","operationId":"data_freshness_check_api_v1_health_data_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Data Freshness Check Api V1 Health Data Get"}}}}}}},"/onboarding/":{"get":{"tags":["onboarding"],"summary":"Onboarding Landing Page","description":"Landing page for self-service onboarding.\n\nReturns the full HTML onboarding page with HTMX integration.","operationId":"onboarding_landing_page_onboarding__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/onboarding/generate-template":{"post":{"tags":["onboarding"],"summary":"Generate Template","description":"Generate a customized ARM template for Lighthouse delegation.\n\nArgs:\n    request: FastAPI request object\n    org_name: Organization name for customization\n\nReturns:\n    HTML response with the template and deployment instructions","operationId":"generate_template_onboarding_generate_template_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_generate_template_onboarding_generate_template_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/verify":{"post":{"tags":["onboarding"],"summary":"Verify Delegation","description":"Verify Lighthouse delegation and create tenant record.\n\nThis endpoint:\n1. Verifies the subscription is accessible via Lighthouse\n2. Creates a Tenant record with use_lighthouse=True\n3. Returns success/failure with details\n\nArgs:\n    request: FastAPI request object\n    tenant_name: Friendly name for the tenant\n    tenant_id: Azure AD Tenant ID\n    subscription_id: Azure Subscription ID\n    description: Optional description\n    db: Database session\n\nReturns:\n    HTML response with verification result","operationId":"verify_delegation_onboarding_verify_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_verify_delegation_onboarding_verify_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/status/{tenant_id}":{"get":{"tags":["onboarding"],"summary":"Get Onboarding Status","description":"Check the onboarding status of a tenant.\n\nArgs:\n    tenant_id: The tenant UUID (not Azure Tenant ID)\n    db: Database session\n\nReturns:\n    JSON response with tenant status","operationId":"get_onboarding_status_onboarding_status__tenant_id__get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/api/template":{"get":{"tags":["onboarding"],"summary":"Get Template Json","description":"Get the ARM template as JSON (API endpoint).\n\nArgs:\n    org_name: Organization name for customization\n\nReturns:\n    JSON response with the ARM template","operationId":"get_template_json_onboarding_api_template_get","parameters":[{"name":"org_name","in":"query","required":false,"schema":{"type":"string","default":"","title":"Org Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/onboarding/api/verify":{"post":{"tags":["onboarding"],"summary":"Verify Delegation Json","description":"Verify delegation and create tenant (JSON API endpoint).\n\nReturns:\n    JSON response with verification result","operationId":"verify_delegation_json_onboarding_api_verify_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_verify_delegation_json_onboarding_api_verify_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/login":{"get":{"tags":["public"],"summary":"Login Page Public","description":"Login page — publicly accessible.","operationId":"login_page_public_login_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/auth/login":{"get":{"tags":["public"],"summary":"Auth Login Page","description":"Login page at canonical /auth/login path — publicly accessible.","operationId":"auth_login_page_auth_login_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/dashboard":{"get":{"tags":["dashboard"],"summary":"Dashboard Page","description":"Main dashboard view with optional tenant scope filter.","operationId":"dashboard_page_dashboard_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/partials/cost-summary-card":{"get":{"tags":["dashboard"],"summary":"Cost Summary Card","description":"HTMX partial: Cost summary card.","operationId":"cost_summary_card_partials_cost_summary_card_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/partials/compliance-gauge":{"get":{"tags":["dashboard"],"summary":"Compliance Gauge","description":"HTMX partial: Compliance score gauge.","operationId":"compliance_gauge_partials_compliance_gauge_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/partials/resource-stats":{"get":{"tags":["dashboard"],"summary":"Resource Stats","description":"HTMX partial: Resource statistics.","operationId":"resource_stats_partials_resource_stats_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/partials/identity-stats":{"get":{"tags":["dashboard"],"summary":"Identity Stats","description":"HTMX partial: Identity statistics.","operationId":"identity_stats_partials_identity_stats_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/sync-dashboard":{"get":{"tags":["dashboard"],"summary":"Sync Dashboard","description":"Main sync dashboard page for DevOps/SRE monitoring.","operationId":"sync_dashboard_sync_dashboard_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/partials/sync-status-card":{"get":{"tags":["dashboard"],"summary":"Sync Status Card Partial","description":"HTMX partial: Live sync status card (refreshes every 30s).","operationId":"sync_status_card_partial_partials_sync_status_card_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/partials/sync-history-table":{"get":{"tags":["dashboard"],"summary":"Sync History Table Partial","description":"HTMX partial: Recent sync jobs table.","operationId":"sync_history_table_partial_partials_sync_history_table_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":15,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/partials/active-alerts":{"get":{"tags":["dashboard"],"summary":"Active Alerts Partial","description":"HTMX partial: Active alerts panel.","operationId":"active_alerts_partial_partials_active_alerts_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/partials/tenant-sync-status":{"get":{"tags":["dashboard"],"summary":"Tenant Sync Status Partial","description":"HTMX partial: Per-tenant sync status grid.","operationId":"tenant_sync_status_partial_partials_tenant_sync_status_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/dmarc":{"get":{"tags":["dashboard"],"summary":"Dmarc Dashboard","description":"DMARC/DKIM security dashboard page.","operationId":"dmarc_dashboard_dmarc_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/costs/summary":{"get":{"tags":["costs"],"summary":"Get Cost Summary","description":"Get aggregated cost summary across all tenants.\n\nArgs:\n    period_days: Number of days to look back (used if start_date not provided)\n    tenant_ids: Filter by specific tenants\n    start_date: Optional explicit start date\n    end_date: Optional explicit end date","operationId":"get_cost_summary_api_v1_costs_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"period_days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Period Days"}},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CostSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/costs/by-tenant":{"get":{"tags":["costs"],"summary":"Get Costs By Tenant","description":"Get cost breakdown by tenant.\n\nArgs:\n    period_days: Number of days to look back\n    tenant_ids: Filter by specific tenants","operationId":"get_costs_by_tenant_api_v1_costs_by_tenant_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"period_days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Period Days"}},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CostByTenant"},"title":"Response Get Costs By Tenant Api V1 Costs By Tenant Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/costs/trends":{"get":{"tags":["costs"],"summary":"Get Cost Trends","description":"Get daily cost trends.\n\nArgs:\n    days: Number of days of history\n    tenant_ids: Filter by specific tenants\n    start_date: Optional explicit start date\n    end_date: Optional explicit end date","operationId":"get_cost_trends_api_v1_costs_trends_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":7,"default":30,"title":"Days"}},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CostTrend"},"title":"Response Get Cost Trends Api V1 Costs Trends Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/costs/trends/forecast":{"get":{"tags":["costs"],"summary":"Get Cost Forecast","description":"Get cost forecast using simple linear projection.\n\nArgs:\n    days: Number of days to forecast","operationId":"get_cost_forecast_api_v1_costs_trends_forecast_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":7,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/costs/anomalies":{"get":{"tags":["costs"],"summary":"Get Cost Anomalies","description":"Get cost anomalies with filtering and pagination.\n\nArgs:\n    acknowledged: Filter by acknowledged status\n    tenant_ids: Filter by specific tenants\n    limit: Maximum results to return\n    offset: Pagination offset\n    sort_by: Field to sort by\n    sort_order: Sort direction (asc or desc)","operationId":"get_cost_anomalies_api_v1_costs_anomalies_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"acknowledged","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Acknowledged"}},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","default":"detected_at","title":"Sort By"}},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","default":"desc","title":"Sort Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/costs/anomalies/trends":{"get":{"tags":["costs"],"summary":"Get Anomaly Trends","description":"Get anomaly trends over time grouped by month.\n\nArgs:\n    months: Number of months to analyze","operationId":"get_anomaly_trends_api_v1_costs_anomalies_trends_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":1,"default":6,"title":"Months"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/costs/anomalies/by-service":{"get":{"tags":["costs"],"summary":"Get Anomalies By Service","description":"Get anomalies grouped by service.\n\nArgs:\n    limit: Maximum number of services to return","operationId":"get_anomalies_by_service_api_v1_costs_anomalies_by_service_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/costs/anomalies/top":{"get":{"tags":["costs"],"summary":"Get Top Anomalies","description":"Get top N anomalies by impact.\n\nArgs:\n    n: Number of top anomalies to return\n    acknowledged: Filter by acknowledged status","operationId":"get_top_anomalies_api_v1_costs_anomalies_top_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"n","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"N"}},{"name":"acknowledged","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Acknowledged"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/costs/anomalies/{anomaly_id}/acknowledge":{"post":{"tags":["costs"],"summary":"Acknowledge Anomaly","description":"Acknowledge a cost anomaly.","operationId":"acknowledge_anomaly_api_v1_costs_anomalies__anomaly_id__acknowledge_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"anomaly_id","in":"path","required":true,"schema":{"type":"integer","title":"Anomaly Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/costs/anomalies/bulk-acknowledge":{"post":{"tags":["costs"],"summary":"Bulk Acknowledge Anomalies","description":"Acknowledge multiple cost anomalies at once.\n\nArgs:\n    request: Contains list of anomaly IDs to acknowledge\n    current_user: User performing the acknowledgment","operationId":"bulk_acknowledge_anomalies_api_v1_costs_anomalies_bulk_acknowledge_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkAcknowledgeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkAcknowledgeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/costs/reservations":{"get":{"tags":["costs"],"summary":"Get Reservation Summaries","description":"Return Reserved Instance utilisation data for a tenant.\n\nCalls the Azure Consumption API ``reservationSummaries`` endpoint when the\ntenant has a ``billing_account_id`` configured.  Returns\n``{\"available\": false, \"reason\": \"billing_account_access_required\"}`` with\nsetup guidance otherwise.\n\nArgs:\n    grain: Granularity -- ``monthly`` (default) or ``daily``.\n    tenant_id: Specific tenant to query.  When omitted, the first\n        accessible tenant is used.","operationId":"get_reservation_summaries_api_v1_costs_reservations_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"grain","in":"query","required":false,"schema":{"enum":["daily","monthly"],"type":"string","description":"Granularity of reservation utilisation data","default":"monthly","title":"Grain"},"description":"Granularity of reservation utilisation data"},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Tenant ID to query; defaults to the first accessible tenant","title":"Tenant Id"},"description":"Tenant ID to query; defaults to the first accessible tenant"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReservationSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/costs/chargeback/{tenant_id}":{"get":{"tags":["costs"],"summary":"Single-tenant chargeback report","description":"Return a chargeback report for a specific tenant over the given date range. When ``format=csv`` the response also carries a ``Content-Disposition: attachment`` header so browsers trigger a download.","operationId":"get_tenant_chargeback_api_v1_costs_chargeback__tenant_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"start_date","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Inclusive start of the reporting period","title":"Start Date"},"description":"Inclusive start of the reporting period"},{"name":"end_date","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Inclusive end of the reporting period","title":"End Date"},"description":"Inclusive end of the reporting period"},{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","description":"Export format: 'json' or 'csv'","default":"json","title":"Format"},"description":"Export format: 'json' or 'csv'"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportedReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/costs/chargeback":{"get":{"tags":["costs"],"summary":"Multi-tenant chargeback / showback report (admin only)","description":"Aggregate chargeback reports across all tenants accessible to the caller. Admin users see all tenants; non-admin users see only their assigned tenants.","operationId":"get_multi_tenant_chargeback_api_v1_costs_chargeback_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Inclusive start of the reporting period","title":"Start Date"},"description":"Inclusive start of the reporting period"},{"name":"end_date","in":"query","required":true,"schema":{"type":"string","format":"date","description":"Inclusive end of the reporting period","title":"End Date"},"description":"Inclusive end of the reporting period"},{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","description":"Export format: 'json' or 'csv'","default":"json","title":"Format"},"description":"Export format: 'json' or 'csv'"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExportedReport"},"title":"Response Get Multi Tenant Chargeback Api V1 Costs Chargeback Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/budgets":{"get":{"tags":["budgets"],"summary":"List Budgets","description":"List budgets with optional filtering and pagination.\n\nArgs:\n    tenant_ids: Filter by specific tenants\n    subscription_ids: Filter by specific subscriptions\n    status: Filter by budget status (active, warning, critical, exceeded)\n    limit: Maximum results to return\n    offset: Pagination offset\n    sort_by: Field to sort by\n    sort_order: Sort direction (asc or desc)\n\nReturns:\n    List of budget list items","operationId":"list_budgets_api_v1_budgets_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}},{"name":"subscription_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Subscription Ids"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(active|warning|critical|exceeded)$"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","default":"created_at","title":"Sort By"}},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","default":"desc","title":"Sort Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BudgetListItem"},"title":"Response List Budgets Api V1 Budgets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["budgets"],"summary":"Create Budget","description":"Create a new budget.\n\nArgs:\n    data: Budget creation data including thresholds and notifications\n\nReturns:\n    Created budget with full details\n\nRaises:\n    HTTPException: If user doesn't have access to tenant","operationId":"create_budget_api_v1_budgets_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/budgets/summary":{"get":{"tags":["budgets"],"summary":"Get Budget Summary","description":"Get aggregated budget summary across accessible tenants.\n\nArgs:\n    tenant_ids: Filter by specific tenants (optional)\n\nReturns:\n    Budget summary with status breakdown and alert counts","operationId":"get_budget_summary_api_v1_budgets_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/budgets/{budget_id}":{"get":{"tags":["budgets"],"summary":"Get Budget","description":"Get detailed budget information by ID.\n\nArgs:\n    budget_id: Budget UUID\n\nReturns:\n    Budget details including thresholds and recent alerts\n\nRaises:\n    HTTPException: If budget not found or access denied","operationId":"get_budget_api_v1_budgets__budget_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"budget_id","in":"path","required":true,"schema":{"type":"string","title":"Budget Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["budgets"],"summary":"Update Budget","description":"Update an existing budget.\n\nArgs:\n    budget_id: Budget UUID\n    data: Update data (only provided fields will be updated)\n\nReturns:\n    Updated budget details\n\nRaises:\n    HTTPException: If budget not found or access denied","operationId":"update_budget_api_v1_budgets__budget_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"budget_id","in":"path","required":true,"schema":{"type":"string","title":"Budget Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["budgets"],"summary":"Delete Budget","description":"Delete a budget.\n\nArgs:\n    budget_id: Budget UUID\n\nRaises:\n    HTTPException: If budget not found or access denied","operationId":"delete_budget_api_v1_budgets__budget_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"budget_id","in":"path","required":true,"schema":{"type":"string","title":"Budget Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/budgets/{budget_id}/alerts":{"get":{"tags":["budgets"],"summary":"Get Budget Alerts","description":"Get alerts for a specific budget.\n\nArgs:\n    budget_id: Budget UUID\n    status: Filter by alert status\n    limit: Maximum results to return\n    offset: Pagination offset\n\nReturns:\n    List of budget alerts","operationId":"get_budget_alerts_api_v1_budgets__budget_id__alerts_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"budget_id","in":"path","required":true,"schema":{"type":"string","title":"Budget Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(pending|acknowledged|resolved|dismissed)$"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"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":{"type":"array","items":{"$ref":"#/components/schemas/BudgetAlertResponse"},"title":"Response Get Budget Alerts Api V1 Budgets  Budget Id  Alerts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/budgets/alerts/all":{"get":{"tags":["budgets"],"summary":"Get All Budget Alerts","description":"Get all budget alerts across accessible tenants.\n\nArgs:\n    tenant_ids: Filter by specific tenants\n    alert_types: Filter by alert types\n    status: Filter by alert status\n    limit: Maximum results to return\n    offset: Pagination offset\n\nReturns:\n    List of budget alerts","operationId":"get_all_budget_alerts_api_v1_budgets_alerts_all_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}},{"name":"alert_types","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Alert Types"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(pending|acknowledged|resolved|dismissed)$"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"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":{"type":"array","items":{"$ref":"#/components/schemas/BudgetAlertResponse"},"title":"Response Get All Budget Alerts Api V1 Budgets Alerts All Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/budgets/alerts/{alert_id}/acknowledge":{"post":{"tags":["budgets"],"summary":"Acknowledge Alert","description":"Acknowledge a budget alert.\n\nArgs:\n    alert_id: Alert ID\n    request: Optional acknowledgment with resolution note\n\nReturns:\n    Success status","operationId":"acknowledge_alert_api_v1_budgets_alerts__alert_id__acknowledge_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"integer","title":"Alert Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/BudgetAlertAcknowledge"},{"type":"null"}],"title":"Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Acknowledge Alert Api V1 Budgets Alerts  Alert Id  Acknowledge Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/budgets/alerts/bulk-acknowledge":{"post":{"tags":["budgets"],"summary":"Bulk Acknowledge Alerts","description":"Acknowledge multiple budget alerts at once.\n\nArgs:\n    request: Contains list of alert IDs and optional resolution note\n\nReturns:\n    Bulk acknowledgment result","operationId":"bulk_acknowledge_alerts_api_v1_budgets_alerts_bulk_acknowledge_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetAlertBulkAcknowledge"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetAlertBulkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/budgets/{budget_id}/sync":{"post":{"tags":["budgets"],"summary":"Sync Single Budget","description":"Sync a single budget from Azure.\n\nArgs:\n    budget_id: Budget UUID\n\nReturns:\n    Sync result","operationId":"sync_single_budget_api_v1_budgets__budget_id__sync_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"budget_id","in":"path","required":true,"schema":{"type":"string","title":"Budget Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetSyncResultResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/budgets/sync/all":{"post":{"tags":["budgets"],"summary":"Sync All Budgets","description":"Sync budgets from Azure for accessible tenants.\n\nArgs:\n    request: Optional sync parameters\n\nReturns:\n    Sync result","operationId":"sync_all_budgets_api_v1_budgets_sync_all_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/BudgetSyncRequest"},{"type":"null"}],"title":"Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetSyncResultResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/compliance/summary":{"get":{"tags":["compliance"],"summary":"Get Compliance Summary","description":"Get aggregated compliance summary across all tenants.\n\nArgs:\n    tenant_ids: Filter by specific tenants","operationId":"get_compliance_summary_api_v1_compliance_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComplianceSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compliance/scores":{"get":{"tags":["compliance"],"summary":"Get Compliance Scores","description":"Get compliance scores, optionally filtered by tenant.\n\nArgs:\n    tenant_id: Single tenant filter (deprecated, use tenant_ids)\n    tenant_ids: Filter by specific tenants\n    limit: Maximum results to return\n    offset: Pagination offset","operationId":"get_compliance_scores_api_v1_compliance_scores_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"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":{"type":"array","items":{"$ref":"#/components/schemas/ComplianceScore"},"title":"Response Get Compliance Scores Api V1 Compliance Scores Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compliance/non-compliant":{"get":{"tags":["compliance"],"summary":"Get Non Compliant Policies","description":"Get non-compliant policy details.\n\nArgs:\n    tenant_id: Single tenant filter (deprecated, use tenant_ids)\n    tenant_ids: Filter by specific tenants\n    severity: Filter by severity level\n    limit: Maximum results to return\n    offset: Pagination offset\n    sort_by: Field to sort by\n    sort_order: Sort direction (asc or desc)","operationId":"get_non_compliant_policies_api_v1_compliance_non_compliant_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(High|Medium|Low)$"},{"type":"null"}],"title":"Severity"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","default":"non_compliant_count","title":"Sort By"}},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","default":"desc","title":"Sort Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PolicyStatus"},"title":"Response Get Non Compliant Policies Api V1 Compliance Non Compliant Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compliance/trends":{"get":{"tags":["compliance"],"summary":"Get Compliance Trends","description":"Get compliance score trends over time.\n\nArgs:\n    tenant_ids: Filter by specific tenants\n    days: Number of days of history to analyze","operationId":"get_compliance_trends_api_v1_compliance_trends_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":7,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compliance/status":{"get":{"tags":["compliance"],"summary":"Compliance Status","description":"Get compliance synchronization status.\n\nReturns:\n    Dictionary with compliance status metrics","operationId":"compliance_status_api_v1_compliance_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Compliance Status Api V1 Compliance Status Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/compliance/frameworks":{"get":{"tags":["compliance-frameworks"],"summary":"List all compliance frameworks","description":"Return summary list of all loaded regulatory frameworks.\n\nReturns id, name, version, authority, and control_count for each\nframework.  Does not include individual control definitions to keep\nthe response compact — use the detail endpoint for full controls.","operationId":"list_frameworks_api_v1_compliance_frameworks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Frameworks Api V1 Compliance Frameworks Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/compliance/frameworks/{framework_id}":{"get":{"tags":["compliance-frameworks"],"summary":"Get framework detail with all controls","description":"Return full framework definition including all control entries.\n\nThe response includes framework metadata (name, version, authority,\nsource_url) plus the complete ``controls`` mapping.","operationId":"get_framework_api_v1_compliance_frameworks__framework_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"framework_id","in":"path","required":true,"schema":{"type":"string","description":"Framework identifier, e.g. SOC2_2017 or NIST_CSF_2.0","examples":["SOC2_2017"],"title":"Framework Id"},"description":"Framework identifier, e.g. SOC2_2017 or NIST_CSF_2.0"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Framework Api V1 Compliance Frameworks  Framework Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compliance/frameworks/{framework_id}/controls/{control_id}":{"get":{"tags":["compliance-frameworks"],"summary":"Get a single control definition","description":"Return a single control's full definition.\n\nThe control_id path segment uses ``{control_id:path}`` to support\ncontrol IDs that contain forward slashes (none currently, but future-safe).","operationId":"get_control_api_v1_compliance_frameworks__framework_id__controls__control_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"framework_id","in":"path","required":true,"schema":{"type":"string","description":"Framework identifier, e.g. SOC2_2017","examples":["SOC2_2017"],"title":"Framework Id"},"description":"Framework identifier, e.g. SOC2_2017"},{"name":"control_id","in":"path","required":true,"schema":{"type":"string","description":"Control identifier, e.g. CC6.1 or PR.DS-01","examples":["CC6.1"],"title":"Control Id"},"description":"Control identifier, e.g. CC6.1 or PR.DS-01"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Control Api V1 Compliance Frameworks  Framework Id  Controls  Control Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compliance/rules":{"post":{"tags":["compliance-rules"],"summary":"Create Rule","description":"Create a custom compliance rule.\n\nRule schemas follow JSON Schema Draft 2020-12. Max size: 64KB.\nRemote $ref URLs are blocked (SSRF prevention).","operationId":"create_rule_api_v1_compliance_rules_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRuleRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Rule Api V1 Compliance Rules Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["compliance-rules"],"summary":"List Rules","description":"List custom compliance rules for a tenant.","operationId":"list_rules_api_v1_compliance_rules_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant UUID to list rules for","title":"Tenant Id"},"description":"Tenant UUID to list rules for"},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"enabled_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Enabled Only"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"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":{"type":"object","additionalProperties":true,"title":"Response List Rules Api V1 Compliance Rules Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compliance/rules/{rule_id}":{"get":{"tags":["compliance-rules"],"summary":"Get Rule","description":"Get a single custom compliance rule.","operationId":"get_rule_api_v1_compliance_rules__rule_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Rule Api V1 Compliance Rules  Rule Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["compliance-rules"],"summary":"Update Rule","description":"Update a custom compliance rule.","operationId":"update_rule_api_v1_compliance_rules__rule_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRuleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Rule Api V1 Compliance Rules  Rule Id  Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["compliance-rules"],"summary":"Delete Rule","description":"Delete a custom compliance rule.","operationId":"delete_rule_api_v1_compliance_rules__rule_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","title":"Rule Id"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/resources":{"get":{"tags":["resources"],"summary":"Get Resources","description":"Get resource inventory with filtering and pagination.\n\nArgs:\n    tenant_id: Filter by single tenant (deprecated, use tenant_ids)\n    tenant_ids: Filter by specific tenants\n    resource_type: Filter by resource type\n    limit: Maximum results to return\n    offset: Pagination offset\n    sort_by: Field to sort by\n    sort_order: Sort direction (asc or desc)","operationId":"get_resources_api_v1_resources_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},{"type":"null"}],"description":"Tenant UUID","title":"Tenant Id"},"description":"Tenant UUID"},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"List of tenant UUIDs","title":"Tenant Ids"},"description":"List of tenant UUIDs"},{"name":"resource_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Resource Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":500,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","maxLength":50,"default":"name","title":"Sort By"}},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","default":"asc","title":"Sort Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceInventory"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/resources/orphaned":{"get":{"tags":["resources"],"summary":"Get Orphaned Resources","description":"Get orphaned resources with filtering and pagination.\n\nArgs:\n    tenant_ids: Filter by specific tenants\n    limit: Maximum results to return\n    offset: Pagination offset","operationId":"get_orphaned_resources_api_v1_resources_orphaned_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"List of tenant UUIDs","title":"Tenant Ids"},"description":"List of tenant UUIDs"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"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":{"type":"array","items":{"$ref":"#/components/schemas/OrphanedResource"},"title":"Response Get Orphaned Resources Api V1 Resources Orphaned Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/resources/idle":{"get":{"tags":["resources"],"summary":"Get Idle Resources","description":"Get idle resources with filtering and pagination.\n\nArgs:\n    tenant_ids: Filter by specific tenants\n    idle_type: Filter by idle type (e.g., low_cpu, no_connections)\n    is_reviewed: Filter by review status\n    limit: Maximum results to return\n    offset: Pagination offset\n    sort_by: Field to sort by\n    sort_order: Sort direction (asc or desc)","operationId":"get_idle_resources_api_v1_resources_idle_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"List of tenant UUIDs","title":"Tenant Ids"},"description":"List of tenant UUIDs"},{"name":"idle_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Idle Type"}},{"name":"is_reviewed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Reviewed"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","maxLength":50,"default":"estimated_monthly_savings","title":"Sort By"}},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","default":"desc","title":"Sort Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/IdleResource"},"title":"Response Get Idle Resources Api V1 Resources Idle Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/resources/idle/summary":{"get":{"tags":["resources"],"summary":"Get Idle Resources Summary","description":"Get summary of idle resources.","operationId":"get_idle_resources_summary_api_v1_resources_idle_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdleResourceSummary"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/resources/idle/{idle_resource_id}/tag":{"post":{"tags":["resources"],"summary":"Tag Idle Resource","description":"Tag an idle resource as reviewed.\n\nArgs:\n    idle_resource_id: ID of the idle resource to tag\n    request_data: Optional review notes\n    current_user: User performing the tagging","operationId":"tag_idle_resource_api_v1_resources_idle__idle_resource_id__tag_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"idle_resource_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"Idle resource ID","title":"Idle Resource Id"},"description":"Idle resource ID"}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TagResourceRequest"},{"type":"null"}],"title":"Request Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TagResourceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/resources/tagging":{"get":{"tags":["resources"],"summary":"Get Tagging Compliance","description":"Get tagging compliance summary.\n\nArgs:\n    required_tags: List of required tags to check\n    tenant_ids: Filter by specific tenants","operationId":"get_tagging_compliance_api_v1_resources_tagging_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"required_tags","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"},"maxItems":50},{"type":"null"}],"title":"Required Tags"}},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"List of tenant UUIDs","title":"Tenant Ids"},"description":"List of tenant UUIDs"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaggingCompliance"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/resources/changes":{"get":{"tags":["resources"],"summary":"Get Resource Changes","description":"Get cross-resource change feed (RM-010).\n\nReturns recent ResourceLifecycleEvents across ALL resources with\noptional filtering by tenant, resource type, event type, and date range.\nOrdered by detection time, newest first.","operationId":"get_resource_changes_api_v1_resources_changes_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$"},{"type":"null"}],"description":"Tenant UUID","title":"Tenant Id"},"description":"Tenant UUID"},{"name":"resource_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Resource Type"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Event Type"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"ISO 8601 start datetime","title":"Since"},"description":"ISO 8601 start datetime"},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"ISO 8601 end datetime","title":"Until"},"description":"ISO 8601 end datetime"},{"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":{"type":"object","additionalProperties":true,"title":"Response Get Resource Changes Api V1 Resources Changes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/resources/{resource_id}/history":{"get":{"tags":["resources"],"summary":"Get Resource History","description":"Get lifecycle history for a specific resource.\n\nReturns create/update/delete events detected during sync runs.\nOrdered by detection time, newest first.","operationId":"get_resource_history_api_v1_resources__resource_id__history_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"resource_id","in":"path","required":true,"schema":{"type":"string","title":"Resource Id"}},{"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":{"type":"object","additionalProperties":true,"title":"Response Get Resource History Api V1 Resources  Resource Id  History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/summary":{"get":{"tags":["identity"],"summary":"Get Identity Summary","description":"Get aggregated identity summary across all tenants.\n\nArgs:\n    tenant_ids: Filter by specific tenants","operationId":"get_identity_summary_api_v1_identity_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentitySummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/users":{"get":{"tags":["identity"],"summary":"Get Users","description":"Get list of user accounts across accessible tenants.\n\nReturns a paginated list of user accounts with basic identity information.\nResults are filtered to only show users from tenants the caller has access to.\n\nArgs:\n    tenant_id: Filter by a specific tenant (deprecated, use tenant_ids)\n    tenant_ids: Filter by multiple tenant IDs\n    user_type: Filter by user type (Member or Guest)\n    account_enabled: Filter by account enabled status\n    mfa_enabled: Filter by MFA enrollment status\n    search: Search filter for display name or user principal name\n    limit: Maximum number of results to return (1-500)\n    offset: Pagination offset\n    sort_by: Field to sort results by\n    sort_order: Sort direction (asc or desc)","operationId":"get_users_api_v1_identity_users_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by specific tenant","title":"Tenant Id"},"description":"Filter by specific tenant"},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter by multiple tenants","title":"Tenant Ids"},"description":"Filter by multiple tenants"},{"name":"user_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(Member|Guest)$"},{"type":"null"}],"description":"Filter by user type","title":"User Type"},"description":"Filter by user type"},{"name":"account_enabled","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by account status","title":"Account Enabled"},"description":"Filter by account status"},{"name":"mfa_enabled","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by MFA status","title":"Mfa Enabled"},"description":"Filter by MFA status"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by display name or UPN","title":"Search"},"description":"Search by display name or UPN"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Maximum results to return","default":100,"title":"Limit"},"description":"Maximum results to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Pagination offset","default":0,"title":"Offset"},"description":"Pagination offset"},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","description":"Field to sort by","default":"display_name","title":"Sort By"},"description":"Field to sort by"},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","description":"Sort direction","default":"asc","title":"Sort Order"},"description":"Sort direction"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserAccount"},"title":"Response Get Users Api V1 Identity Users Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/privileged":{"get":{"tags":["identity"],"summary":"Get Privileged Accounts","description":"Get privileged account details.\n\nArgs:\n    tenant_id: Single tenant filter (deprecated, use tenant_ids)\n    tenant_ids: Filter by specific tenants\n    risk_level: Filter by risk level (High, Medium, Low)\n    mfa_enabled: Filter by MFA status\n    limit: Maximum results to return\n    offset: Pagination offset\n    sort_by: Field to sort by\n    sort_order: Sort direction (asc or desc)","operationId":"get_privileged_accounts_api_v1_identity_privileged_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}},{"name":"risk_level","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(High|Medium|Low)$"},{"type":"null"}],"title":"Risk Level"}},{"name":"mfa_enabled","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Mfa Enabled"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","default":"display_name","title":"Sort By"}},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","default":"asc","title":"Sort Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PrivilegedAccount"},"title":"Response Get Privileged Accounts Api V1 Identity Privileged Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/guests":{"get":{"tags":["identity"],"summary":"Get Guest Accounts","description":"Get guest account details.\n\nArgs:\n    tenant_id: Single tenant filter (deprecated, use tenant_ids)\n    tenant_ids: Filter by specific tenants\n    stale_only: Only show stale guest accounts\n    limit: Maximum results to return\n    offset: Pagination offset","operationId":"get_guest_accounts_api_v1_identity_guests_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}},{"name":"stale_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Stale Only"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"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":{"type":"array","items":{"$ref":"#/components/schemas/GuestAccount"},"title":"Response Get Guest Accounts Api V1 Identity Guests Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/stale":{"get":{"tags":["identity"],"summary":"Get Stale Accounts","description":"Get stale account details.\n\nArgs:\n    days_inactive: Days since last activity\n    tenant_id: Single tenant filter (deprecated, use tenant_ids)\n    tenant_ids: Filter by specific tenants\n    limit: Maximum results to return\n    offset: Pagination offset","operationId":"get_stale_accounts_api_v1_identity_stale_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"days_inactive","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":7,"default":30,"title":"Days Inactive"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"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":{"type":"array","items":{"$ref":"#/components/schemas/StaleAccount"},"title":"Response Get Stale Accounts Api V1 Identity Stale Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/trends":{"get":{"tags":["identity"],"summary":"Get Identity Trends","description":"Get identity metrics trends over time.\n\nArgs:\n    tenant_ids: Filter by specific tenants\n    days: Number of days of history to analyze\n\nReturns trends for:\n- MFA adoption rate\n- Guest account count\n- Privileged account count\n- Stale account count","operationId":"get_identity_trends_api_v1_identity_trends_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":7,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/admin-roles/summary":{"get":{"tags":["identity"],"summary":"Get Admin Roles Summary","description":"Get comprehensive admin role summary for a tenant.\n\nReturns statistics on:\n- Total directory roles\n- Total role assignments\n- Global admin count\n- Security admin count\n- Privileged role admin count\n- Other admin count\n- Service principals with admin roles\n- PIM assignments\n\nArgs:\n    tenant_id: The Azure tenant ID to query\n    use_cache: Whether to use cached data","operationId":"get_admin_roles_summary_api_v1_identity_admin_roles_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Azure tenant ID","title":"Tenant Id"},"description":"Azure tenant ID"},{"name":"use_cache","in":"query","required":false,"schema":{"type":"boolean","description":"Use cached data if available","default":true,"title":"Use Cache"},"description":"Use cached data if available"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/admin-roles/privileged-users":{"get":{"tags":["identity"],"summary":"Get Privileged Users Admin Roles","description":"Get all privileged users with their admin role assignments.\n\nReturns users with directory roles including:\n- Global Administrators\n- Security Administrators\n- Privileged Role Administrators\n- Other admin roles\n\nArgs:\n    tenant_id: The Azure tenant ID to query\n    include_pim: Whether to include PIM assignments","operationId":"get_privileged_users_admin_roles_api_v1_identity_admin_roles_privileged_users_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Azure tenant ID","title":"Tenant Id"},"description":"Azure tenant ID"},{"name":"include_pim","in":"query","required":false,"schema":{"type":"boolean","description":"Include PIM eligible/active assignments","default":true,"title":"Include Pim"},"description":"Include PIM eligible/active assignments"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/admin-roles/global-admins":{"get":{"tags":["identity"],"summary":"Get Global Admins","description":"Get all Global Administrators.\n\nArgs:\n    tenant_id: The Azure tenant ID to query","operationId":"get_global_admins_api_v1_identity_admin_roles_global_admins_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Azure tenant ID","title":"Tenant Id"},"description":"Azure tenant ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/admin-roles/security-admins":{"get":{"tags":["identity"],"summary":"Get Security Admins","description":"Get all Security Administrators.\n\nArgs:\n    tenant_id: The Azure tenant ID to query","operationId":"get_security_admins_api_v1_identity_admin_roles_security_admins_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Azure tenant ID","title":"Tenant Id"},"description":"Azure tenant ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/admin-roles/service-principals":{"get":{"tags":["identity"],"summary":"Get Privileged Service Principals","description":"Get service principals with admin role assignments.\n\nArgs:\n    tenant_id: The Azure tenant ID to query","operationId":"get_privileged_service_principals_api_v1_identity_admin_roles_service_principals_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Azure tenant ID","title":"Tenant Id"},"description":"Azure tenant ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/admin-roles/cache/invalidate":{"post":{"tags":["identity"],"summary":"Invalidate Admin Roles Cache","description":"Invalidate cached admin role data for a tenant.\n\nUse this endpoint to force a refresh of admin role data.\n\nArgs:\n    tenant_id: The Azure tenant ID\n    data_type: Optional specific data type to invalidate (roles, assignments, pim, summary)","operationId":"invalidate_admin_roles_cache_api_v1_identity_admin_roles_cache_invalidate_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Azure tenant ID","title":"Tenant Id"},"description":"Azure tenant ID"},{"name":"data_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Specific data type to invalidate","title":"Data Type"},"description":"Specific data type to invalidate"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/licenses":{"get":{"tags":["identity"],"summary":"List Tenant Licenses","description":"List all user license assignments for a tenant.\n\nReturns an aggregated view of every licensed user in the tenant,\nenriched with SKU part numbers (e.g. 'ENTERPRISEPREMIUM' for E5).\nUses ``GET /users?$select=assignedLicenses`` plus\n``GET /subscribedSkus`` for SKU name resolution.\n\nArgs:\n    tenant_id: Azure AD tenant ID to query.\n\nReturns:\n    List of UserLicenseSummary objects — one per licensed user.","operationId":"list_tenant_licenses_api_v1_identity_licenses_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Azure tenant ID","title":"Tenant Id"},"description":"Azure tenant ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserLicenseSummary"},"title":"Response List Tenant Licenses Api V1 Identity Licenses Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/licenses/{user_id}":{"get":{"tags":["identity"],"summary":"Get User Licenses","description":"Get license details for a specific user.\n\nFetches the full SKU and service-plan breakdown for *user_id* via\n``GET /users/{user_id}/licenseDetails``.\n\nArgs:\n    user_id:   Azure AD object ID of the user.\n    tenant_id: Azure AD tenant ID the user belongs to.\n\nReturns:\n    List of UserLicense objects — one per assigned SKU.","operationId":"get_user_licenses_api_v1_identity_licenses__user_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Azure tenant ID","title":"Tenant Id"},"description":"Azure tenant ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserLicense"},"title":"Response Get User Licenses Api V1 Identity Licenses  User Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/access-reviews":{"get":{"tags":["identity"],"summary":"List Access Reviews","description":"List pending access reviews for a tenant.\n\nAuto-creates a review for any stale privileged assignment that does\nnot yet have one.  An assignment is stale when the assigned user has\nnot signed in for >90 days, or has never signed in.\n\nRequires Graph permissions: ``RoleManagement.Read.All``,\n``AuditLog.Read.All``.\n\nArgs:\n    tenant_id: Azure AD tenant ID to query.\n\nReturns:\n    List of :class:`AccessReview` objects in ``pending`` status.","operationId":"list_access_reviews_api_v1_identity_access_reviews_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Azure tenant ID","title":"Tenant Id"},"description":"Azure tenant ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccessReview"},"title":"Response List Access Reviews Api V1 Identity Access Reviews Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/identity/access-reviews/{review_id}/action":{"post":{"tags":["identity"],"summary":"Take Review Action","description":"Approve or revoke a privileged role assignment under review.\n\n- **approve** - keeps the assignment; marks the review resolved.\n- **revoke**  - calls\n  ``DELETE /roleManagement/directory/roleAssignments/{id}`` on Graph,\n  then marks the review resolved.  Requires\n  ``RoleManagement.ReadWrite.Directory``.\n\nArgs:\n    review_id: UUID of the access review to action.\n    body:      JSON body with ``{\"action\": \"approve\" | \"revoke\"}``.\n    tenant_id: Azure AD tenant ID that owns the review.\n\nReturns:\n    The updated :class:`AccessReview` with resolved status.","operationId":"take_review_action_api_v1_identity_access_reviews__review_id__action_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"review_id","in":"path","required":true,"schema":{"type":"string","title":"Review Id"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Azure tenant ID","title":"Tenant Id"},"description":"Azure tenant ID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewActionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessReview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tenants":{"get":{"tags":["tenants"],"summary":"List Tenants","description":"List all tenants the current user has access to.","operationId":"list_tenants_api_v1_tenants_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TenantResponse"},"type":"array","title":"Response List Tenants Api V1 Tenants Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["tenants"],"summary":"Create Tenant","description":"Create a new tenant configuration.\n\nRequires admin role.","operationId":"create_tenant_api_v1_tenants_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/tenants/{id}":{"get":{"tags":["tenants"],"summary":"Get Tenant","description":"Get a specific tenant.\n\nUser must have access to the tenant.","operationId":"get_tenant_api_v1_tenants__id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Tenant UUID","title":"Id"},"description":"Tenant UUID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["tenants"],"summary":"Update Tenant","description":"Update a tenant configuration.\n\nRequires admin role.","operationId":"update_tenant_api_v1_tenants__id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Tenant UUID","title":"Id"},"description":"Tenant UUID"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tenants"],"summary":"Delete Tenant","description":"Delete a tenant configuration.\n\nRequires admin role.","operationId":"delete_tenant_api_v1_tenants__id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Tenant UUID","title":"Id"},"description":"Tenant UUID"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tenants/{id}/subscriptions":{"get":{"tags":["tenants"],"summary":"Get Tenant Subscriptions","description":"Get subscriptions for a tenant.\n\nUser must have access to the tenant.","operationId":"get_tenant_subscriptions_api_v1_tenants__id__subscriptions_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"Tenant UUID","title":"Id"},"description":"Tenant UUID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SubscriptionResponse"},"title":"Response Get Tenant Subscriptions Api V1 Tenants  Id  Subscriptions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sync/{sync_type}":{"post":{"tags":["sync"],"summary":"Trigger Sync","description":"Trigger a manual sync job.","operationId":"trigger_sync_api_v1_sync__sync_type__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sync_type","in":"path","required":true,"schema":{"enum":["costs","compliance","resources","identity"],"type":"string","title":"Sync Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sync/trigger/{sync_type}":{"post":{"tags":["sync"],"summary":"Trigger Sync Named","description":"Trigger a manual sync job at /trigger/{sync_type}.\n\nCanonical endpoint for sync triggers — mirrors POST /{sync_type} but\nsits at a more explicit path so API consumers can tell at a glance\nthat this is a write operation, not a resource path.","operationId":"trigger_sync_named_api_v1_sync_trigger__sync_type__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sync_type","in":"path","required":true,"schema":{"enum":["costs","compliance","resources","identity"],"type":"string","title":"Sync Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sync/status":{"get":{"tags":["sync"],"summary":"Get Sync Status","description":"Get status of sync jobs.","operationId":"get_sync_status_api_v1_sync_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/sync/status/health":{"get":{"tags":["sync"],"summary":"Get Sync Health","description":"Get overall sync health status with metrics.","operationId":"get_sync_health_api_v1_sync_status_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/sync/history":{"get":{"tags":["sync"],"summary":"Get Sync History","description":"Get recent sync job execution history.","operationId":"get_sync_history_api_v1_sync_history_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Job Type"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sync/metrics":{"get":{"tags":["sync"],"summary":"Get Sync Metrics","description":"Get aggregate sync job metrics.","operationId":"get_sync_metrics_api_v1_sync_metrics_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Job Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sync/alerts":{"get":{"tags":["sync"],"summary":"Get Sync Alerts","description":"Get sync job alerts.","operationId":"get_sync_alerts_api_v1_sync_alerts_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Job Type"}},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(info|warning|error|critical)$"},{"type":"null"}],"title":"Severity"}},{"name":"include_resolved","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Resolved"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sync/alerts/{alert_id}/resolve":{"post":{"tags":["sync"],"summary":"Resolve Alert","description":"Resolve a sync job alert.","operationId":"resolve_alert_api_v1_sync_alerts__alert_id__resolve_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"Alert ID","title":"Alert Id"},"description":"Alert ID"},{"name":"resolved_by","in":"query","required":false,"schema":{"type":"string","maxLength":100,"default":"system","title":"Resolved By"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sync/partials/sync-status":{"get":{"tags":["sync"],"summary":"Sync Status Partial","description":"HTMX partial: Sync status card.","operationId":"sync_status_partial_api_v1_sync_partials_sync_status_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/sync/partials/sync-alerts":{"get":{"tags":["sync"],"summary":"Sync Alerts Partial","description":"HTMX partial: Recent alerts panel.","operationId":"sync_alerts_partial_api_v1_sync_partials_sync_alerts_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/riverside":{"get":{"tags":["riverside"],"summary":"Riverside Dashboard","description":"Riverside compliance dashboard page.","operationId":"riverside_dashboard_riverside_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/partials/riverside-badge":{"get":{"tags":["riverside"],"summary":"Riverside Badge","description":"HTMX partial for Riverside navigation badge.","operationId":"riverside_badge_partials_riverside_badge_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/riverside/summary":{"get":{"tags":["riverside"],"summary":"Get Riverside Summary","description":"Get executive summary for Riverside compliance dashboard.","operationId":"get_riverside_summary_api_v1_riverside_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Riverside Summary Api V1 Riverside Summary Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/riverside/mfa-status":{"get":{"tags":["riverside"],"summary":"Get Mfa Status","description":"Get MFA tracking status for all tenants.","operationId":"get_mfa_status_api_v1_riverside_mfa_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Mfa Status Api V1 Riverside Mfa Status Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/riverside/maturity-scores":{"get":{"tags":["riverside"],"summary":"Get Maturity Scores","description":"Get maturity scores for all domains and tenants.","operationId":"get_maturity_scores_api_v1_riverside_maturity_scores_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Maturity Scores Api V1 Riverside Maturity Scores Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/riverside/requirements":{"get":{"tags":["riverside"],"summary":"Get Requirements","description":"Get requirements list with optional filtering.","operationId":"get_requirements_api_v1_riverside_requirements_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by category (IAM, GS, DS)","title":"Category"},"description":"Filter by category (IAM, GS, DS)"},{"name":"priority","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by priority (P0, P1, P2)","title":"Priority"},"description":"Filter by priority (P0, P1, P2)"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status (not_started, in_progress, completed, blocked)","title":"Status"},"description":"Filter by status (not_started, in_progress, completed, blocked)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Requirements Api V1 Riverside Requirements Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/riverside/gaps":{"get":{"tags":["riverside"],"summary":"Get Gaps","description":"Get critical gaps analysis.","operationId":"get_gaps_api_v1_riverside_gaps_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Gaps Api V1 Riverside Gaps Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/riverside/sync":{"post":{"tags":["riverside"],"summary":"Trigger Sync","description":"Trigger manual sync of all Riverside compliance data.\n\nRequires operator or admin role.","operationId":"trigger_sync_api_v1_riverside_sync_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/threats/cybeta":{"get":{"tags":["threats"],"summary":"Get Cybeta Threats","description":"Get threat intelligence data from Riverside/Cybeta sources.\n\nRetrieves threat intelligence data including vulnerability counts,\nthreat scores, and peer comparison metrics.\n\nArgs:\n    tenant_ids: Optional list of tenant IDs to filter results\n    start_date: Start date for date range filtering\n    end_date: End date for date range filtering\n    limit: Maximum number of records to return (default 100, max 500)\n\nReturns:\n    List of threat intelligence records","operationId":"get_cybeta_threats_api_v1_threats_cybeta_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Cybeta Threats Api V1 Threats Cybeta Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/threats/summary/{tenant_id}":{"get":{"tags":["threats"],"summary":"Get Threat Summary","description":"Get threat summary for a specific tenant.\n\nReturns the latest threat snapshot and aggregated statistics for\nthe specified tenant.\n\nArgs:\n    tenant_id: The tenant ID to get summary for\n\nReturns:\n    Dictionary with aggregated threat summary","operationId":"get_threat_summary_api_v1_threats_summary__tenant_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Threat Summary Api V1 Threats Summary  Tenant Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bulk/tags/apply":{"post":{"tags":["bulk"],"summary":"Bulk Apply Tags","description":"Apply tags to multiple resources.\n\nSupports both specific resource IDs and filter-based selection.\nRequires operator or admin role.","operationId":"bulk_apply_tags_bulk_tags_apply_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkTagOperation"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkTagResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/bulk/tags/remove":{"post":{"tags":["bulk"],"summary":"Bulk Remove Tags","description":"Remove tags from multiple resources.\n\nRequires operator or admin role.","operationId":"bulk_remove_tags_bulk_tags_remove_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_bulk_remove_tags_bulk_tags_remove_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkTagResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/bulk/anomalies/acknowledge":{"post":{"tags":["bulk"],"summary":"Bulk Acknowledge Anomalies","description":"Acknowledge multiple cost anomalies at once.","operationId":"bulk_acknowledge_anomalies_bulk_anomalies_acknowledge_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkAnomalyAcknowledgeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Bulk Acknowledge Anomalies Bulk Anomalies Acknowledge Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/bulk/recommendations/dismiss":{"post":{"tags":["bulk"],"summary":"Bulk Dismiss Recommendations","description":"Dismiss multiple recommendations at once.","operationId":"bulk_dismiss_recommendations_bulk_recommendations_dismiss_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkRecommendationDismissRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Bulk Dismiss Recommendations Bulk Recommendations Dismiss Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/bulk/idle-resources/review":{"post":{"tags":["bulk"],"summary":"Bulk Review Idle Resources","description":"Mark multiple idle resources as reviewed.","operationId":"bulk_review_idle_resources_bulk_idle_resources_review_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkIdleResourceReviewRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Bulk Review Idle Resources Bulk Idle Resources Review Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/dmarc/summary":{"get":{"tags":["dmarc"],"summary":"Get Dmarc Summary","description":"Get DMARC/DKIM summary across tenants.\n\nReturns aggregated statistics including:\n- Total domains configured\n- DMARC policy compliance rates\n- DKIM enablement status\n- Security scores per tenant\n- Recent authentication failures\n- Active alerts","operationId":"get_dmarc_summary_api_v1_dmarc_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tenant ID","title":"Tenant Id"},"description":"Filter by tenant ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Dmarc Summary Api V1 Dmarc Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dmarc/records":{"get":{"tags":["dmarc"],"summary":"Get Dmarc Records","description":"Get DMARC records for a tenant.\n\nReturns all DMARC DNS records configured for the tenant's domains\nwith policy details and validation status.","operationId":"get_dmarc_records_api_v1_dmarc_records_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID to query","title":"Tenant Id"},"description":"Tenant ID to query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Dmarc Records Api V1 Dmarc Records Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dmarc/dkim":{"get":{"tags":["dmarc"],"summary":"Get Dkim Records","description":"Get DKIM records for a tenant.\n\nReturns all DKIM signing configurations including key status,\nalignment, and rotation dates.","operationId":"get_dkim_records_api_v1_dmarc_dkim_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID to query","title":"Tenant Id"},"description":"Tenant ID to query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Dkim Records Api V1 Dmarc Dkim Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dmarc/score":{"get":{"tags":["dmarc"],"summary":"Get Domain Security Score","description":"Get domain security score for a tenant.\n\nReturns a calculated security score (0-100) based on:\n- DMARC policy strength\n- DKIM enablement and alignment\n- SPF configuration","operationId":"get_domain_security_score_api_v1_dmarc_score_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID to query","title":"Tenant Id"},"description":"Tenant ID to query"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Domain Security Score Api V1 Dmarc Score Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dmarc/trends":{"get":{"tags":["dmarc"],"summary":"Get Compliance Trends","description":"Get DMARC compliance trends over time.\n\nReturns daily compliance rates showing authentication success/failure\nrates for the specified time period.","operationId":"get_compliance_trends_api_v1_dmarc_trends_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tenant ID","title":"Tenant Id"},"description":"Filter by tenant ID"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"description":"Number of days of history","default":30,"title":"Days"},"description":"Number of days of history"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Compliance Trends Api V1 Dmarc Trends Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dmarc/reports":{"get":{"tags":["dmarc"],"summary":"Get Dmarc Reports","description":"Get DMARC aggregate reports for a tenant.\n\nReturns parsed DMARC aggregate reports with authentication breakdowns\n(DKIM/SPF pass/fail rates).","operationId":"get_dmarc_reports_api_v1_dmarc_reports_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID to query","title":"Tenant Id"},"description":"Tenant ID to query"},{"name":"domain","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by domain","title":"Domain"},"description":"Filter by domain"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum results","default":50,"title":"Limit"},"description":"Maximum results"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Dmarc Reports Api V1 Dmarc Reports Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dmarc/alerts":{"get":{"tags":["dmarc"],"summary":"Get Dmarc Alerts","description":"Get DMARC/DKIM security alerts.\n\nReturns active alerts for security issues like policy changes,\nkey rotation failures, or authentication failures.","operationId":"get_dmarc_alerts_api_v1_dmarc_alerts_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tenant ID","title":"Tenant Id"},"description":"Filter by tenant ID"},{"name":"acknowledged","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by acknowledged status","title":"Acknowledged"},"description":"Filter by acknowledged status"},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by severity","title":"Severity"},"description":"Filter by severity"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum results","default":20,"title":"Limit"},"description":"Maximum results"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Dmarc Alerts Api V1 Dmarc Alerts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dmarc/alerts/{alert_id}/acknowledge":{"post":{"tags":["dmarc"],"summary":"Acknowledge Alert","description":"Acknowledge a DMARC/DKIM alert.\n\nMarks an alert as acknowledged with the user and timestamp.","operationId":"acknowledge_alert_api_v1_dmarc_alerts__alert_id__acknowledge_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"string","title":"Alert Id"}},{"name":"user","in":"query","required":true,"schema":{"type":"string","description":"User acknowledging the alert","title":"User"},"description":"User acknowledging the alert"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Acknowledge Alert Api V1 Dmarc Alerts  Alert Id  Acknowledge Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dmarc/sync":{"post":{"tags":["dmarc"],"summary":"Sync Dmarc Data","description":"Trigger DMARC/DKIM sync for a tenant.\n\nManually triggers synchronization of DMARC records, DKIM configuration,\nor aggregate reports for the specified tenant.","operationId":"sync_dmarc_data_api_v1_dmarc_sync_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","description":"Tenant ID to sync","title":"Tenant Id"},"description":"Tenant ID to sync"},{"name":"sync_type","in":"query","required":false,"schema":{"type":"string","description":"Type of sync: dmarc, dkim, reports, all","default":"all","title":"Sync Type"},"description":"Type of sync: dmarc, dkim, reports, all"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Sync Dmarc Data Api V1 Dmarc Sync Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/accessibility/touch-targets":{"get":{"tags":["accessibility"],"summary":"Analyze Touch Targets","description":"Analyze current page for touch target compliance.\n\nReturns elements that are smaller than 24×24 CSS pixels (WCAG 2.5.8).\nNote: This is a server-side analysis endpoint. Client-side JS scanning\nwould be more comprehensive for dynamic content.","operationId":"analyze_touch_targets_api_v1_accessibility_touch_targets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TouchTargetReport"}}}}}}},"/api/v1/accessibility/wcag-checklist":{"get":{"tags":["accessibility"],"summary":"Get Wcag Checklist","description":"Get WCAG 2.2 AA manual testing checklist.","operationId":"get_wcag_checklist_api_v1_accessibility_wcag_checklist_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/exports/costs":{"get":{"tags":["exports"],"summary":"Export Costs","description":"Export costs to CSV.\n\nArgs:\n    start_date: Start date for cost data (defaults to 30 days ago)\n    end_date: End date for cost data (defaults to today)\n    tenant_ids: Filter by specific tenants","operationId":"export_costs_api_v1_exports_costs_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"}},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/exports/resources":{"get":{"tags":["exports"],"summary":"Export Resources","description":"Export resource inventory to CSV.\n\nArgs:\n    tenant_ids: Filter by specific tenants\n    resource_type: Filter by resource type\n    include_orphaned: Include orphaned resources flag","operationId":"export_resources_api_v1_exports_resources_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}},{"name":"resource_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Type"}},{"name":"include_orphaned","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Orphaned"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/exports/compliance":{"get":{"tags":["exports"],"summary":"Export Compliance","description":"Export compliance report to CSV.\n\nArgs:\n    tenant_ids: Filter by specific tenants\n    include_non_compliant: Include non-compliant policies","operationId":"export_compliance_api_v1_exports_compliance_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}},{"name":"include_non_compliant","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Non Compliant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/costs":{"get":{"tags":["pages"],"summary":"Costs Page","description":"Cost management dashboard page.","operationId":"costs_page_costs_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/compliance":{"get":{"tags":["pages"],"summary":"Compliance Page","description":"Compliance monitoring dashboard page.","operationId":"compliance_page_compliance_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/resources":{"get":{"tags":["pages"],"summary":"Resources Page","description":"Resource inventory dashboard page.","operationId":"resources_page_resources_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/identity":{"get":{"tags":["pages"],"summary":"Identity Page","description":"Identity & access dashboard page.","operationId":"identity_page_identity_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin":{"get":{"tags":["pages"],"summary":"Admin Page","description":"Admin dashboard — user management, role assignment, platform stats.","operationId":"admin_page_admin_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/admin/partials/users-table":{"get":{"tags":["pages"],"summary":"Admin Users Table Partial","description":"HTMX partial: admin users table body rows.","operationId":"admin_users_table_partial_admin_partials_users_table_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Per Page"}},{"name":"search","in":"query","required":false,"schema":{"type":"string","maxLength":100,"default":"","title":"Search"}},{"name":"role","in":"query","required":false,"schema":{"type":"string","maxLength":50,"default":"","title":"Role"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/privacy":{"get":{"tags":["pages"],"summary":"Privacy Page","description":"Privacy policy page.","operationId":"privacy_page_privacy_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/topology":{"get":{"tags":["pages"],"summary":"Topology Page","description":"Azure infrastructure topology visualisation.","operationId":"topology_page_topology_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/topology/mermaid":{"get":{"tags":["pages"],"summary":"Topology Mermaid","description":"Serve the raw Mermaid source for client-side rendering.","operationId":"topology_mermaid_topology_mermaid_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/topology/svg":{"get":{"tags":["pages"],"summary":"Topology Svg","description":"Serve the SVG export when the weekly workflow has generated it.","operationId":"topology_svg_topology_svg_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/preflight":{"get":{"tags":["preflight"],"summary":"Preflight Page","description":"Preflight checks dashboard page.","operationId":"preflight_page_api_v1_preflight_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/preflight/status":{"get":{"tags":["preflight"],"summary":"Get Preflight Status","description":"Get the latest preflight check results.","operationId":"get_preflight_status_api_v1_preflight_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightStatusResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/preflight/run":{"post":{"tags":["preflight"],"summary":"Run Preflight Checks","description":"Run preflight checks.\n\nExecute all preflight checks to verify Azure tenant access, GitHub access,\nand system requirements. Results include detailed status for each check\nalong with recommendations for any failures.\n\nArgs:\n    request: Optional parameters to customize the check run\n\nReturns:\n    Complete PreflightReport with all check results","operationId":"run_preflight_checks_api_v1_preflight_run_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightCheckRequest","default":{"fail_fast":false,"timeout_seconds":30.0}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/preflight/tenants/{tenant_id}":{"get":{"tags":["preflight"],"summary":"Check Tenant Preflight","description":"Run preflight checks for a specific tenant.\n\nVerifies access and configuration for a single Azure tenant.\nUser must have access to the tenant.\n\nArgs:\n    tenant_id: The tenant ID to check\n\nReturns:\n    PreflightReport with tenant-specific check results","operationId":"check_tenant_preflight_api_v1_preflight_tenants__tenant_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightReport"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/preflight/github":{"get":{"tags":["preflight"],"summary":"Check Github Preflight","description":"Run GitHub-specific preflight checks.\n\nVerifies GitHub repository access and Actions workflow permissions.\n\nReturns:\n    PreflightReport with GitHub-specific check results","operationId":"check_github_preflight_api_v1_preflight_github_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightReport"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/preflight/report/json":{"get":{"tags":["preflight"],"summary":"Get Report Json","description":"Get the latest preflight report in JSON format.","operationId":"get_report_json_api_v1_preflight_report_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/preflight/report/markdown":{"get":{"tags":["preflight"],"summary":"Get Report Markdown","description":"Get the latest preflight report in Markdown format.","operationId":"get_report_markdown_api_v1_preflight_report_markdown_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/preflight/summary/tenants":{"get":{"tags":["preflight"],"summary":"Get Tenant Summaries","description":"Get summaries grouped by tenant from the latest report.","operationId":"get_tenant_summaries_api_v1_preflight_summary_tenants_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TenantCheckSummary"},"type":"array","title":"Response Get Tenant Summaries Api V1 Preflight Summary Tenants Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/preflight/summary/categories":{"get":{"tags":["preflight"],"summary":"Get Category Summaries","description":"Get summaries grouped by category from the latest report.","operationId":"get_category_summaries_api_v1_preflight_summary_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CategorySummary"},"type":"array","title":"Response Get Category Summaries Api V1 Preflight Summary Categories Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/preflight/clear-cache":{"post":{"tags":["preflight"],"summary":"Clear Preflight Cache","description":"Clear all preflight check caches.","operationId":"clear_preflight_cache_api_v1_preflight_clear_cache_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/privacy/consent/categories":{"get":{"tags":["privacy"],"summary":"Get Consent Categories","description":"Get all available consent categories with descriptions.","operationId":"get_consent_categories_api_v1_privacy_consent_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/privacy/consent/preferences":{"get":{"tags":["privacy"],"summary":"Get Consent Preferences","description":"Get current user's consent preferences.","operationId":"get_consent_preferences_api_v1_privacy_consent_preferences_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["privacy"],"summary":"Save Consent Preferences","description":"Save user's consent preferences.","operationId":"save_consent_preferences_api_v1_privacy_consent_preferences_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentPreferences"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/privacy/consent/accept-all":{"post":{"tags":["privacy"],"summary":"Accept All Cookies","description":"Accept all cookie categories.","operationId":"accept_all_cookies_api_v1_privacy_consent_accept_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/privacy/consent/reject-all":{"post":{"tags":["privacy"],"summary":"Reject All Cookies","description":"Reject all non-essential cookies.","operationId":"reject_all_cookies_api_v1_privacy_consent_reject_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/privacy/consent/status":{"get":{"tags":["privacy"],"summary":"Get Consent Status","description":"Get quick consent status for frontend checks.","operationId":"get_consent_status_api_v1_privacy_consent_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/search/":{"get":{"tags":["search"],"summary":"Global Search","description":"Global search across all entities.\n\nSearches: tenants, users, resources, alerts","operationId":"global_search_api_v1_search__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"Search query","title":"Q"},"description":"Search query"},{"name":"types","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/SearchResultType"}},{"type":"null"}],"description":"Filter by types","title":"Types"},"description":"Filter by types"},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tenant","title":"Tenant Id"},"description":"Filter by tenant"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SearchResult"},"title":"Response Global Search Api V1 Search  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search/suggestions":{"get":{"tags":["search"],"summary":"Search Suggestions","description":"Quick search suggestions for autocomplete.","operationId":"search_suggestions_api_v1_search_suggestions_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"description":"Partial search query","title":"Q"},"description":"Partial search query"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"default":5,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/resources/provisioning-standards":{"get":{"tags":["provisioning-standards"],"summary":"Get Provisioning Standards","description":"Get the current provisioning standards configuration.\n\nReturns the full YAML-defined standards including naming conventions,\nallowed regions, required tags, SKU restrictions, and network/encryption standards.","operationId":"get_provisioning_standards_api_v1_resources_provisioning_standards_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Provisioning Standards Api V1 Resources Provisioning Standards Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/resources/provisioning-standards/validate":{"post":{"tags":["provisioning-standards"],"summary":"Validate Resource","description":"Validate a single resource against provisioning standards.\n\nReturns a validation result with any violations and warnings.","operationId":"validate_resource_api_v1_resources_provisioning_standards_validate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateResourceRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Validate Resource Api V1 Resources Provisioning Standards Validate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/resources/provisioning-standards/naming/validate":{"get":{"tags":["provisioning-standards"],"summary":"Validate Naming","description":"Validate a resource name against naming conventions.","operationId":"validate_naming_api_v1_resources_provisioning_standards_naming_validate_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string","description":"Resource name to validate","title":"Name"},"description":"Resource name to validate"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Validate Naming Api V1 Resources Provisioning Standards Naming Validate Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/resources/provisioning-standards/regions/validate":{"get":{"tags":["provisioning-standards"],"summary":"Validate Region","description":"Validate a region against allowed region standards.","operationId":"validate_region_api_v1_resources_provisioning_standards_regions_validate_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"region","in":"query","required":true,"schema":{"type":"string","description":"Azure region to validate","title":"Region"},"description":"Azure region to validate"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Validate Region Api V1 Resources Provisioning Standards Regions Validate Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/metrics/health":{"get":{"tags":["metrics"],"summary":"Health Metrics","description":"Basic health metrics.","operationId":"health_metrics_api_v1_metrics_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/metrics/cache":{"get":{"tags":["metrics"],"summary":"Cache Metrics","description":"Cache performance metrics.","operationId":"cache_metrics_api_v1_metrics_cache_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/metrics/database":{"get":{"tags":["metrics"],"summary":"Database Metrics","description":"Database connection metrics.","operationId":"database_metrics_api_v1_metrics_database_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/monitoring/performance":{"get":{"tags":["monitoring"],"summary":"Get Performance Metrics","description":"Get comprehensive performance metrics.\n\nReturns cache stats, sync job performance, and query metrics.","operationId":"get_performance_metrics_monitoring_performance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Performance Metrics Monitoring Performance Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/monitoring/cache":{"get":{"tags":["monitoring"],"summary":"Get Cache Metrics","description":"Get cache hit/miss metrics and statistics.","operationId":"get_cache_metrics_monitoring_cache_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Cache Metrics Monitoring Cache Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/monitoring/sync-jobs":{"get":{"tags":["monitoring"],"summary":"Get Sync Job Metrics","description":"Get sync job performance metrics.\n\nArgs:\n    job_type: Filter by job type (e.g., 'resources', 'costs')\n    tenant_id: Filter by tenant ID\n    limit: Maximum number of records to return","operationId":"get_sync_job_metrics_monitoring_sync_jobs_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Type"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Sync Job Metrics Monitoring Sync Jobs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitoring/queries":{"get":{"tags":["monitoring"],"summary":"Get Query Metrics","description":"Get query performance metrics.\n\nArgs:\n    slow_only: Only return slow queries (above threshold)\n    limit: Maximum number of records to return","operationId":"get_query_metrics_monitoring_queries_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slow_only","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Slow Only"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response Get Query Metrics Monitoring Queries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/monitoring/reset":{"post":{"tags":["monitoring"],"summary":"Reset Performance Metrics","description":"Reset all performance metrics. Use with caution!","operationId":"reset_performance_metrics_monitoring_reset_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Reset Performance Metrics Monitoring Reset Post"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/monitoring/health":{"get":{"tags":["monitoring"],"summary":"Health Check","description":"Quick health check with basic performance indicators.","operationId":"health_check_monitoring_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Check Monitoring Health Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/monitoring/health/deep":{"get":{"tags":["monitoring"],"summary":"Health Check Deep","description":"Deep health check that verifies all dependencies.\n\nChecks:\n- Database connectivity with pool statistics\n- Cache availability with hit/miss metrics\n- Azure API connectivity (lightweight call)","operationId":"health_check_deep_monitoring_health_deep_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Check Deep Monitoring Health Deep Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/recommendations":{"get":{"tags":["recommendations"],"summary":"Get Recommendations","description":"Get all recommendations with optional filtering.\n\nArgs:\n    category: Filter by recommendation category\n    tenant_ids: Filter by specific tenants\n    impact: Filter by impact level (Low, Medium, High, Critical)\n    dismissed: Include dismissed recommendations\n    limit: Maximum results to return\n    offset: Pagination offset\n    sort_by: Field to sort by\n    sort_order: Sort direction (asc or desc)","operationId":"get_recommendations_api_v1_recommendations_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/RecommendationCategory"},{"type":"null"}],"title":"Category"}},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tenant Ids"}},{"name":"impact","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(Low|Medium|High|Critical)$"},{"type":"null"}],"title":"Impact"}},{"name":"dismissed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"title":"Dismissed"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","default":"created_at","title":"Sort By"}},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","default":"desc","title":"Sort Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Recommendation"},"title":"Response Get Recommendations Api V1 Recommendations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/recommendations/by-category":{"get":{"tags":["recommendations"],"summary":"Get Recommendations By Category","description":"Get recommendations grouped by category (cost, security, performance, reliability).","operationId":"get_recommendations_by_category_api_v1_recommendations_by_category_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/RecommendationsByCategory"},"type":"array","title":"Response Get Recommendations By Category Api V1 Recommendations By Category Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/recommendations/by-tenant":{"get":{"tags":["recommendations"],"summary":"Get Recommendations By Tenant","description":"Get recommendations grouped by tenant.","operationId":"get_recommendations_by_tenant_api_v1_recommendations_by_tenant_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/recommendations/savings-potential":{"get":{"tags":["recommendations"],"summary":"Get Savings Potential","description":"Get total potential savings across all recommendations.","operationId":"get_savings_potential_api_v1_recommendations_savings_potential_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavingsPotential"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/recommendations/summary":{"get":{"tags":["recommendations"],"summary":"Get Recommendation Summary","description":"Get summary statistics by category.","operationId":"get_recommendation_summary_api_v1_recommendations_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/RecommendationSummary"},"type":"array","title":"Response Get Recommendation Summary Api V1 Recommendations Summary Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/recommendations/{recommendation_id}/dismiss":{"post":{"tags":["recommendations"],"summary":"Dismiss Recommendation","description":"Dismiss a recommendation.\n\nArgs:\n    recommendation_id: ID of the recommendation to dismiss\n    request_data: Optional dismissal reason\n    current_user: User performing the dismissal","operationId":"dismiss_recommendation_api_v1_recommendations__recommendation_id__dismiss_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"recommendation_id","in":"path","required":true,"schema":{"type":"integer","title":"Recommendation Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DismissRecommendationRequest"},{"type":"null"}],"title":"Request Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DismissRecommendationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users":{"get":{"tags":["admin"],"summary":"List users with pagination and filters","description":"List all known users with their roles and tenant access.\n\nUsers are discovered from ``UserTenant`` mappings.  Results can be\nfiltered by role and searched by user ID.","operationId":"list_users_api_v1_admin_users_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Items per page","default":20,"title":"Per Page"},"description":"Items per page"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by user ID","title":"Search"},"description":"Search by user ID"},{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by role slug","title":"Role"},"description":"Filter by role slug"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedUsersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{user_id}":{"get":{"tags":["admin"],"summary":"Get user detail","description":"Get a single user's profile with roles, permissions, and tenant access.","operationId":"get_user_api_v1_admin_users__user_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{user_id}/roles":{"put":{"tags":["admin"],"summary":"Update user roles","description":"Update roles for a user across all tenant mappings.\n\nValidates each role against ``permissions.Role``.  The highest-privilege\nrole is stored in ``UserTenant.role`` for all of the user's active\ntenant mappings.","operationId":"update_user_roles_api_v1_admin_users__user_id__roles_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RolesUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/roles":{"get":{"tags":["admin"],"summary":"List all available roles","description":"List all available roles with their permission sets.","operationId":"list_roles_api_v1_admin_roles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/RoleDetailResponse"},"type":"array","title":"Response List Roles Api V1 Admin Roles Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/roles/{role_name}":{"get":{"tags":["admin"],"summary":"Get role detail","description":"Get a single role's detail with its full permission list.","operationId":"get_role_api_v1_admin_roles__role_name__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"role_name","in":"path","required":true,"schema":{"type":"string","title":"Role Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/stats":{"get":{"tags":["admin"],"summary":"Admin dashboard statistics","description":"Get aggregate stats: user counts, tenant counts, last sync times.","operationId":"get_admin_stats_api_v1_admin_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminStatsResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/health":{"get":{"summary":"Health Check","description":"Basic health check endpoint.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/healthz/data":{"get":{"summary":"Healthz Data Alias","description":"Friendly alias for /api/v1/health/data — per-tenant sync freshness.\n\nMounted at /healthz/data so the UI header partial and staging smoke\nchecks can use a short, unversioned path. Delegates to the versioned\nendpoint to avoid duplicating the query logic.","operationId":"healthz_data_alias_healthz_data_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/detailed":{"get":{"summary":"Detailed Health Check","description":"Detailed health check with component status and pool statistics.","operationId":"detailed_health_check_health_detailed_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/status":{"get":{"summary":"Get System Status","description":"Get detailed system status and health metrics.\n\nReturns comprehensive status including:\n- Database health\n- Scheduler status\n- Cache metrics\n- Sync job summaries\n- Active alerts count","operationId":"get_system_status_api_v1_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"summary":"Root","description":"Root endpoint - redirect to dashboard or login.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AccessReview":{"properties":{"id":{"type":"string","title":"Id","description":"Unique review ID (UUID)"},"assignment_id":{"type":"string","title":"Assignment Id","description":"The role assignment being reviewed"},"tenant_id":{"type":"string","title":"Tenant Id","description":"Azure AD tenant ID that owns this review"},"status":{"type":"string","enum":["pending","approved","revoked"],"title":"Status","description":"Review status: pending | approved | revoked","default":"pending"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When the review was created"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At","description":"When the review was resolved (approved or revoked)"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id","description":"Azure AD user object ID of the assigned principal"},"user_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Display Name","description":"Display name of the assigned user"},"role_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role Name","description":"Friendly name of the directory role being reviewed"},"days_inactive":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Inactive","description":"Days since the user last signed in; None means never signed in"}},"type":"object","required":["assignment_id","tenant_id"],"title":"AccessReview","description":"An access review task created for a stale privileged assignment."},"AdminStatsResponse":{"properties":{"total_users":{"type":"integer","title":"Total Users"},"users_by_role":{"additionalProperties":{"type":"integer"},"type":"object","title":"Users By Role"},"active_tenants":{"type":"integer","title":"Active Tenants"},"total_tenants":{"type":"integer","title":"Total Tenants"},"total_user_tenant_mappings":{"type":"integer","title":"Total User Tenant Mappings"},"last_syncs":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object","title":"Last Syncs"}},"type":"object","required":["total_users","users_by_role","active_tenants","total_tenants","total_user_tenant_mappings"],"title":"AdminStatsResponse","description":"Admin dashboard statistics."},"AzureADLoginRequest":{"properties":{"code":{"type":"string","title":"Code"},"redirect_uri":{"type":"string","title":"Redirect Uri"},"code_verifier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Verifier"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},"type":"object","required":["code","redirect_uri"],"title":"AzureADLoginRequest","description":"Azure AD OAuth2 callback request."},"Body_bulk_remove_tags_bulk_tags_remove_post":{"properties":{"resource_ids":{"items":{"type":"string"},"type":"array","title":"Resource Ids"},"tag_names":{"items":{"type":"string"},"type":"array","title":"Tag Names"}},"type":"object","required":["resource_ids","tag_names"],"title":"Body_bulk_remove_tags_bulk_tags_remove_post"},"Body_generate_template_onboarding_generate_template_post":{"properties":{"org_name":{"type":"string","title":"Org Name","description":"Organization name","default":""}},"type":"object","title":"Body_generate_template_onboarding_generate_template_post"},"Body_login_api_v1_auth_login_post":{"properties":{"grant_type":{"anyOf":[{"type":"string","pattern":"^password$"},{"type":"null"}],"title":"Grant Type"},"username":{"type":"string","title":"Username"},"password":{"type":"string","format":"password","title":"Password"},"scope":{"type":"string","title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"format":"password","title":"Client Secret"}},"type":"object","required":["username","password"],"title":"Body_login_api_v1_auth_login_post"},"Body_token_endpoint_api_v1_auth_token_post":{"properties":{"grant_type":{"type":"string","title":"Grant Type"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"redirect_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Uri"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"}},"type":"object","required":["grant_type"],"title":"Body_token_endpoint_api_v1_auth_token_post"},"Body_verify_delegation_json_onboarding_api_verify_post":{"properties":{"tenant_name":{"type":"string","title":"Tenant Name"},"tenant_id":{"type":"string","title":"Tenant Id"},"subscription_id":{"type":"string","title":"Subscription Id"},"description":{"type":"string","title":"Description","default":""}},"type":"object","required":["tenant_name","tenant_id","subscription_id"],"title":"Body_verify_delegation_json_onboarding_api_verify_post"},"Body_verify_delegation_onboarding_verify_post":{"properties":{"tenant_name":{"type":"string","title":"Tenant Name","description":"Friendly name for the tenant"},"tenant_id":{"type":"string","title":"Tenant Id","description":"Azure AD Tenant ID"},"subscription_id":{"type":"string","title":"Subscription Id","description":"Azure Subscription ID"},"description":{"type":"string","title":"Description","description":"Optional description","default":""}},"type":"object","required":["tenant_name","tenant_id","subscription_id"],"title":"Body_verify_delegation_onboarding_verify_post"},"BudgetAlertAcknowledge":{"properties":{"resolution_note":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Resolution Note","description":"Optional note about resolution"}},"type":"object","title":"BudgetAlertAcknowledge","description":"Request to acknowledge a budget alert."},"BudgetAlertBulkAcknowledge":{"properties":{"alert_ids":{"items":{"type":"integer"},"type":"array","minItems":1,"title":"Alert Ids","description":"List of alert IDs to acknowledge"},"resolution_note":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Resolution Note"}},"type":"object","required":["alert_ids"],"title":"BudgetAlertBulkAcknowledge","description":"Request to acknowledge multiple budget alerts."},"BudgetAlertBulkResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"acknowledged_count":{"type":"integer","title":"Acknowledged Count"},"failed_ids":{"items":{"type":"integer"},"type":"array","title":"Failed Ids"},"acknowledged_at":{"type":"string","format":"date-time","title":"Acknowledged At"}},"type":"object","required":["success","acknowledged_count","failed_ids","acknowledged_at"],"title":"BudgetAlertBulkResponse","description":"Response after bulk acknowledging alerts."},"BudgetAlertResponse":{"properties":{"id":{"type":"integer","title":"Id"},"budget_id":{"type":"string","title":"Budget Id"},"budget_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Budget Name","description":"Budget name for display"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id","description":"Tenant ID for display"},"subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Id","description":"Subscription ID for display"},"threshold_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Threshold Id"},"alert_type":{"type":"string","title":"Alert Type"},"status":{"type":"string","title":"Status"},"threshold_percentage":{"type":"number","title":"Threshold Percentage"},"threshold_amount":{"type":"number","title":"Threshold Amount"},"current_spend":{"type":"number","title":"Current Spend"},"forecasted_spend":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Forecasted Spend"},"utilization_percentage":{"type":"number","title":"Utilization Percentage"},"triggered_at":{"type":"string","format":"date-time","title":"Triggered At"},"acknowledged_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Acknowledged At"},"acknowledged_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Acknowledged By"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"},"resolution_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Note"},"notification_sent":{"type":"boolean","title":"Notification Sent"},"notification_sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Notification Sent At"}},"type":"object","required":["id","budget_id","threshold_id","alert_type","status","threshold_percentage","threshold_amount","current_spend","forecasted_spend","utilization_percentage","triggered_at","acknowledged_at","acknowledged_by","resolved_at","resolution_note","notification_sent","notification_sent_at"],"title":"BudgetAlertResponse","description":"Budget alert response schema."},"BudgetByTenant":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"tenant_name":{"type":"string","title":"Tenant Name"},"budget_count":{"type":"integer","title":"Budget Count"},"total_amount":{"type":"number","title":"Total Amount"},"total_spend":{"type":"number","title":"Total Spend"},"utilization_percentage":{"type":"number","title":"Utilization Percentage"}},"type":"object","required":["tenant_id","tenant_name","budget_count","total_amount","total_spend","utilization_percentage"],"title":"BudgetByTenant","description":"Budget summary grouped by tenant."},"BudgetCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"Budget name"},"amount":{"type":"number","exclusiveMinimum":0.0,"title":"Amount","description":"Budget amount limit"},"time_grain":{"type":"string","title":"Time Grain","description":"Budget period granularity","default":"Monthly"},"category":{"type":"string","title":"Category","description":"Budget category (Cost or Usage)","default":"Cost"},"start_date":{"type":"string","format":"date","title":"Start Date","description":"Budget period start date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date","description":"Budget period end date"},"resource_group":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Resource Group","description":"Resource group scope (null for subscription)"},"currency":{"type":"string","maxLength":10,"title":"Currency","description":"Currency code","default":"USD"},"tenant_id":{"type":"string","minLength":1,"title":"Tenant Id","description":"Tenant ID"},"subscription_id":{"type":"string","minLength":1,"title":"Subscription Id","description":"Subscription ID"},"thresholds":{"items":{"$ref":"#/components/schemas/BudgetThresholdConfig"},"type":"array","title":"Thresholds","description":"Alert thresholds to create"},"notifications":{"items":{"$ref":"#/components/schemas/BudgetNotificationConfig"},"type":"array","title":"Notifications","description":"Notification channels"}},"type":"object","required":["name","amount","start_date","tenant_id","subscription_id"],"title":"BudgetCreate","description":"Schema for creating a new budget."},"BudgetListItem":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"amount":{"type":"number","title":"Amount"},"current_spend":{"type":"number","title":"Current Spend"},"utilization_percentage":{"type":"number","title":"Utilization Percentage"},"status":{"type":"string","title":"Status"},"time_grain":{"type":"string","title":"Time Grain"},"currency":{"type":"string","title":"Currency"},"start_date":{"type":"string","format":"date","title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"subscription_id":{"type":"string","title":"Subscription Id"},"resource_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Group"},"alert_count":{"type":"integer","title":"Alert Count","description":"Number of pending alerts","default":0},"last_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Synced At"}},"type":"object","required":["id","name","amount","current_spend","utilization_percentage","status","time_grain","currency","start_date","end_date","subscription_id","resource_group","last_synced_at"],"title":"BudgetListItem","description":"Simplified budget item for list views."},"BudgetNotificationConfig":{"properties":{"notification_type":{"type":"string","title":"Notification Type","description":"Type: email, webhook, teams"},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Type-specific config"},"is_enabled":{"type":"boolean","title":"Is Enabled","default":true}},"type":"object","required":["notification_type"],"title":"BudgetNotificationConfig","description":"Configuration for budget notifications."},"BudgetResponse":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"Budget name"},"amount":{"type":"number","exclusiveMinimum":0.0,"title":"Amount","description":"Budget amount limit"},"time_grain":{"type":"string","title":"Time Grain","description":"Budget period granularity","default":"Monthly"},"category":{"type":"string","title":"Category","description":"Budget category (Cost or Usage)","default":"Cost"},"start_date":{"type":"string","format":"date","title":"Start Date","description":"Budget period start date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date","description":"Budget period end date"},"resource_group":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Resource Group","description":"Resource group scope (null for subscription)"},"currency":{"type":"string","maxLength":10,"title":"Currency","description":"Currency code","default":"USD"},"id":{"type":"string","title":"Id","description":"Budget UUID"},"tenant_id":{"type":"string","title":"Tenant Id","description":"Tenant ID"},"subscription_id":{"type":"string","title":"Subscription Id","description":"Subscription ID"},"current_spend":{"type":"number","title":"Current Spend","description":"Current spending amount","default":0.0},"forecasted_spend":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Forecasted Spend","description":"Forecasted spending"},"utilization_percentage":{"type":"number","title":"Utilization Percentage","description":"Budget utilization %","default":0.0},"status":{"type":"string","title":"Status","description":"Budget status","default":"active"},"azure_budget_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Azure Budget Id","description":"Full Azure resource ID"},"etag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Etag","description":"ETag for optimistic concurrency"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Creation timestamp"},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"Last update timestamp"},"last_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Synced At","description":"Last sync timestamp"},"thresholds":{"items":{"$ref":"#/components/schemas/BudgetThresholdResponse"},"type":"array","title":"Thresholds"},"recent_alerts":{"items":{"$ref":"#/components/schemas/BudgetAlertResponse"},"type":"array","title":"Recent Alerts"},"remaining_amount":{"type":"number","title":"Remaining Amount","description":"Remaining budget amount"},"is_exceeded":{"type":"boolean","title":"Is Exceeded","description":"Whether budget is exceeded","default":false},"days_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Remaining","description":"Days until budget ends"}},"type":"object","required":["name","amount","start_date","id","tenant_id","subscription_id","created_at","updated_at","remaining_amount"],"title":"BudgetResponse","description":"Full budget response schema."},"BudgetSummary":{"properties":{"total_budgets":{"type":"integer","title":"Total Budgets","description":"Total number of budgets"},"total_budget_amount":{"type":"number","title":"Total Budget Amount","description":"Sum of all budget amounts"},"total_current_spend":{"type":"number","title":"Total Current Spend","description":"Sum of all current spending"},"overall_utilization":{"type":"number","title":"Overall Utilization","description":"Overall utilization percentage"},"active_count":{"type":"integer","title":"Active Count","default":0},"warning_count":{"type":"integer","title":"Warning Count","default":0},"critical_count":{"type":"integer","title":"Critical Count","default":0},"exceeded_count":{"type":"integer","title":"Exceeded Count","default":0},"pending_alerts":{"type":"integer","title":"Pending Alerts","default":0},"acknowledged_alerts":{"type":"integer","title":"Acknowledged Alerts","default":0},"by_tenant":{"items":{"$ref":"#/components/schemas/BudgetByTenant"},"type":"array","title":"By Tenant"}},"type":"object","required":["total_budgets","total_budget_amount","total_current_spend","overall_utilization"],"title":"BudgetSummary","description":"Aggregated budget summary for dashboard."},"BudgetSyncRequest":{"properties":{"tenant_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tenant Ids","description":"Specific tenants to sync (null for all)"},"subscription_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Subscription Ids","description":"Specific subscriptions to sync (null for all)"},"sync_type":{"type":"string","title":"Sync Type","description":"Sync type: full, incremental","default":"incremental"}},"type":"object","title":"BudgetSyncRequest","description":"Request to sync budgets from Azure."},"BudgetSyncResultResponse":{"properties":{"id":{"type":"integer","title":"Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"sync_type":{"type":"string","title":"Sync Type"},"status":{"type":"string","title":"Status"},"budgets_synced":{"type":"integer","title":"Budgets Synced"},"budgets_created":{"type":"integer","title":"Budgets Created"},"budgets_updated":{"type":"integer","title":"Budgets Updated"},"budgets_deleted":{"type":"integer","title":"Budgets Deleted"},"alerts_triggered":{"type":"integer","title":"Alerts Triggered"},"errors_count":{"type":"integer","title":"Errors Count"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"error_details":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Details"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"duration_seconds":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Seconds"}},"type":"object","required":["id","tenant_id","sync_type","status","budgets_synced","budgets_created","budgets_updated","budgets_deleted","alerts_triggered","errors_count","error_message","error_details","started_at","completed_at","duration_seconds"],"title":"BudgetSyncResultResponse","description":"Budget sync operation result."},"BudgetThresholdConfig":{"properties":{"percentage":{"type":"number","maximum":500.0,"minimum":0.0,"title":"Percentage","description":"Threshold percentage"},"alert_type":{"type":"string","title":"Alert Type","description":"Alert type (warning, critical, etc)","default":"warning"},"contact_emails":{"items":{"type":"string"},"type":"array","title":"Contact Emails"},"contact_roles":{"items":{"type":"string"},"type":"array","title":"Contact Roles"},"contact_groups":{"items":{"type":"string"},"type":"array","title":"Contact Groups"},"is_enabled":{"type":"boolean","title":"Is Enabled","default":true}},"type":"object","required":["percentage"],"title":"BudgetThresholdConfig","description":"Configuration for a budget alert threshold."},"BudgetThresholdResponse":{"properties":{"id":{"type":"integer","title":"Id"},"budget_id":{"type":"string","title":"Budget Id"},"percentage":{"type":"number","title":"Percentage"},"amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount"},"alert_type":{"type":"string","title":"Alert Type"},"contact_emails":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Emails"},"contact_roles":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Roles"},"contact_groups":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Groups"},"is_enabled":{"type":"boolean","title":"Is Enabled"},"trigger_count":{"type":"integer","title":"Trigger Count"},"last_triggered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Triggered At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","budget_id","percentage","amount","alert_type","contact_emails","contact_roles","contact_groups","is_enabled","trigger_count","last_triggered_at","created_at","updated_at"],"title":"BudgetThresholdResponse","description":"Full budget threshold response."},"BudgetUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"amount":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Amount"},"time_grain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Grain"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"start_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"End Date"},"resource_group":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Resource Group"},"currency":{"anyOf":[{"type":"string","maxLength":10},{"type":"null"}],"title":"Currency"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","title":"BudgetUpdate","description":"Schema for updating an existing budget."},"BulkAcknowledgeRequest":{"properties":{"anomaly_ids":{"items":{"type":"integer"},"type":"array","title":"Anomaly Ids"}},"type":"object","required":["anomaly_ids"],"title":"BulkAcknowledgeRequest","description":"Request to acknowledge multiple anomalies."},"BulkAcknowledgeResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"acknowledged_count":{"type":"integer","title":"Acknowledged Count"},"failed_ids":{"items":{"type":"integer"},"type":"array","title":"Failed Ids"},"acknowledged_at":{"type":"string","format":"date-time","title":"Acknowledged At"}},"type":"object","required":["success","acknowledged_count","failed_ids","acknowledged_at"],"title":"BulkAcknowledgeResponse","description":"Response after bulk acknowledging anomalies."},"BulkAnomalyAcknowledgeRequest":{"properties":{"anomaly_ids":{"items":{"type":"integer"},"type":"array","title":"Anomaly Ids"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["anomaly_ids"],"title":"BulkAnomalyAcknowledgeRequest","description":"Request to acknowledge multiple anomalies."},"BulkIdleResourceReviewRequest":{"properties":{"idle_resource_ids":{"items":{"type":"integer"},"type":"array","title":"Idle Resource Ids"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["idle_resource_ids"],"title":"BulkIdleResourceReviewRequest","description":"Request to review multiple idle resources."},"BulkRecommendationDismissRequest":{"properties":{"recommendation_ids":{"items":{"type":"integer"},"type":"array","title":"Recommendation Ids"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["recommendation_ids","reason"],"title":"BulkRecommendationDismissRequest","description":"Request to dismiss multiple recommendations."},"BulkTagOperation":{"properties":{"resource_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Resource Ids"},"resource_filter":{"anyOf":[{"$ref":"#/components/schemas/ResourceFilterCriteria"},{"type":"null"}]},"tags":{"additionalProperties":{"type":"string"},"type":"object","title":"Tags"},"required_tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Required Tags"},"overwrite_existing":{"type":"boolean","title":"Overwrite Existing","default":true}},"type":"object","title":"BulkTagOperation","description":"Request to tag multiple resources."},"BulkTagResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"total_processed":{"type":"integer","title":"Total Processed"},"success_count":{"type":"integer","title":"Success Count"},"failed_count":{"type":"integer","title":"Failed Count"},"results":{"items":{"$ref":"#/components/schemas/TagOperationResult"},"type":"array","title":"Results"}},"type":"object","required":["success","message","total_processed","success_count","failed_count"],"title":"BulkTagResponse","description":"Response from bulk tag operation."},"CategorySummary":{"properties":{"category":{"$ref":"#/components/schemas/CheckCategory"},"display_name":{"type":"string","title":"Display Name"},"checks_passed":{"type":"integer","title":"Checks Passed"},"checks_failed":{"type":"integer","title":"Checks Failed"},"checks_warning":{"type":"integer","title":"Checks Warning"},"checks_skipped":{"type":"integer","title":"Checks Skipped"},"overall_status":{"$ref":"#/components/schemas/CheckStatus"}},"type":"object","required":["category","display_name","checks_passed","checks_failed","checks_warning","checks_skipped","overall_status"],"title":"CategorySummary","description":"Summary of checks by category."},"ChargebackReport":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id","description":"Internal tenant ID"},"tenant_name":{"type":"string","title":"Tenant Name","description":"Human-readable tenant name"},"period_start":{"type":"string","format":"date","title":"Period Start","description":"Inclusive start of reporting period"},"period_end":{"type":"string","format":"date","title":"Period End","description":"Inclusive end of reporting period"},"total_cost":{"type":"number","minimum":0.0,"title":"Total Cost","description":"Total cost for the period"},"currency":{"type":"string","title":"Currency","default":"USD"},"by_resource_type":{"items":{"$ref":"#/components/schemas/ResourceTypeCost"},"type":"array","title":"By Resource Type","description":"Cost breakdown by Azure service / resource type"},"by_resource_group":{"items":{"$ref":"#/components/schemas/ResourceGroupCost"},"type":"array","title":"By Resource Group","description":"Cost breakdown by Azure resource group"}},"type":"object","required":["tenant_id","tenant_name","period_start","period_end","total_cost"],"title":"ChargebackReport","description":"Complete chargeback report for a single tenant over a date range."},"CheckCategory":{"type":"string","enum":["azure_auth","azure_subscriptions","azure_cost_management","azure_policy","azure_resources","azure_graph","azure_security","github_access","github_actions","database","system","riverside","mfa_compliance"],"title":"CheckCategory","description":"Categories of preflight checks."},"CheckResult":{"properties":{"check_id":{"type":"string","title":"Check Id","description":"Unique identifier for the check"},"name":{"type":"string","title":"Name","description":"Human-readable name of the check"},"category":{"$ref":"#/components/schemas/CheckCategory","description":"Category this check belongs to"},"status":{"$ref":"#/components/schemas/CheckStatus","description":"Current status of the check"},"message":{"type":"string","title":"Message","description":"Human-readable description of the result"},"details":{"additionalProperties":true,"type":"object","title":"Details","description":"Technical details and error messages"},"duration_ms":{"type":"number","title":"Duration Ms","description":"Execution time in milliseconds","default":0},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"When this check was run"},"recommendations":{"items":{"type":"string"},"type":"array","title":"Recommendations","description":"List of fix recommendations"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id","description":"Tenant ID if this check is tenant-specific"}},"type":"object","required":["check_id","name","category","status","message"],"title":"CheckResult","description":"Result of a single preflight check."},"CheckStatus":{"type":"string","enum":["pass","warning","fail","skipped","running"],"title":"CheckStatus","description":"Enumeration of possible check statuses."},"ComplianceScore":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"tenant_name":{"type":"string","title":"Tenant Name"},"subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Id"},"subscription_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Name"},"overall_compliance_percent":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Overall Compliance Percent"},"secure_score":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Secure Score"},"compliant_resources":{"type":"integer","title":"Compliant Resources"},"non_compliant_resources":{"type":"integer","title":"Non Compliant Resources"},"exempt_resources":{"type":"integer","title":"Exempt Resources"},"last_updated":{"type":"string","format":"date-time","title":"Last Updated"}},"type":"object","required":["tenant_id","tenant_name","overall_compliance_percent","compliant_resources","non_compliant_resources","exempt_resources","last_updated"],"title":"ComplianceScore","description":"Compliance score for a tenant/subscription.","examples":[{"compliant_resources":350,"exempt_resources":10,"last_updated":"2025-05-25T10:00:00Z","non_compliant_resources":50,"overall_compliance_percent":87.5,"secure_score":72.0,"subscription_id":"sub-prod-001","subscription_name":"HTT Production","tenant_id":"tenant-htt-001","tenant_name":"HTT Brands"}]},"ComplianceSummary":{"properties":{"average_compliance_percent":{"type":"number","title":"Average Compliance Percent"},"total_compliant_resources":{"type":"integer","title":"Total Compliant Resources"},"total_non_compliant_resources":{"type":"integer","title":"Total Non Compliant Resources"},"total_exempt_resources":{"type":"integer","title":"Total Exempt Resources"},"scores_by_tenant":{"items":{"$ref":"#/components/schemas/ComplianceScore"},"type":"array","title":"Scores By Tenant"},"top_violations":{"items":{"$ref":"#/components/schemas/PolicyViolation"},"type":"array","title":"Top Violations"}},"type":"object","required":["average_compliance_percent","total_compliant_resources","total_non_compliant_resources","total_exempt_resources"],"title":"ComplianceSummary","description":"Aggregated compliance summary."},"ConsentPreferences":{"properties":{"necessary":{"type":"boolean","title":"Necessary","description":"Always required for site function","default":true},"functional":{"type":"boolean","title":"Functional","default":false},"analytics":{"type":"boolean","title":"Analytics","default":false},"marketing":{"type":"boolean","title":"Marketing","default":false},"timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timestamp"},"gpc_override":{"type":"boolean","title":"Gpc Override","description":"GPC signal forced opt-out","default":false},"version":{"type":"string","title":"Version","default":"1.0"}},"type":"object","title":"ConsentPreferences","description":"User consent preferences for each category.","example":{"analytics":false,"functional":true,"gpc_override":false,"marketing":false,"necessary":true,"timestamp":"2026-03-26T15:45:00Z","version":"1.0"}},"CostByTenant":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"tenant_name":{"type":"string","title":"Tenant Name"},"total_cost":{"type":"number","title":"Total Cost"},"currency":{"type":"string","title":"Currency","default":"USD"},"subscription_costs":{"items":{"$ref":"#/components/schemas/SubscriptionCost"},"type":"array","title":"Subscription Costs"}},"type":"object","required":["tenant_id","tenant_name","total_cost"],"title":"CostByTenant","description":"Cost breakdown by tenant."},"CostSummary":{"properties":{"total_cost":{"type":"number","title":"Total Cost","description":"Total cost across all tenants"},"currency":{"type":"string","title":"Currency","default":"USD"},"period_start":{"type":"string","format":"date","title":"Period Start"},"period_end":{"type":"string","format":"date","title":"Period End"},"tenant_count":{"type":"integer","title":"Tenant Count"},"subscription_count":{"type":"integer","title":"Subscription Count"},"cost_change_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cost Change Percent","description":"Percentage change from previous period"},"top_services":{"items":{"$ref":"#/components/schemas/ServiceCost"},"type":"array","title":"Top Services"}},"type":"object","required":["total_cost","period_start","period_end","tenant_count","subscription_count"],"title":"CostSummary","description":"Aggregated cost summary across all tenants.","examples":[{"cost_change_percent":-3.2,"currency":"USD","period_end":"2025-05-31","period_start":"2025-05-01","subscription_count":12,"tenant_count":5,"top_services":[{"cost":1200.0,"percentage_of_total":42.1,"service_name":"Virtual Machines"},{"cost":450.0,"percentage_of_total":15.8,"service_name":"SQL Database"}],"total_cost":2847.53}]},"CostTrend":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"cost":{"type":"number","title":"Cost"},"forecast":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Forecast"}},"type":"object","required":["date","cost"],"title":"CostTrend","description":"Cost trend data point."},"CreateRuleRequest":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id","description":"Tenant UUID this rule belongs to"},"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"category":{"type":"string","title":"Category","description":"resource_property | compliance_score | mfa_coverage"},"severity":{"type":"string","title":"Severity","description":"low | medium | high | critical","default":"medium"},"rule_schema":{"additionalProperties":true,"type":"object","title":"Rule Schema","description":"JSON Schema definition for this rule"}},"type":"object","required":["tenant_id","name","category","rule_schema"],"title":"CreateRuleRequest"},"DismissRecommendationRequest":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"DismissRecommendationRequest","description":"Request to dismiss a recommendation."},"DismissRecommendationResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"recommendation_id":{"type":"integer","title":"Recommendation Id"},"dismissed_at":{"type":"string","format":"date-time","title":"Dismissed At"}},"type":"object","required":["success","recommendation_id","dismissed_at"],"title":"DismissRecommendationResponse","description":"Response after dismissing a recommendation."},"ExportedReport":{"properties":{"format":{"type":"string","enum":["json","csv"],"title":"Format","description":"Export format"},"filename":{"type":"string","title":"Filename","description":"Suggested download filename"},"content":{"type":"string","title":"Content","description":"Serialised report (JSON string or CSV text)"},"report":{"anyOf":[{"$ref":"#/components/schemas/ChargebackReport"},{"type":"null"}],"description":"Structured report object; populated for JSON exports"}},"type":"object","required":["format","filename","content"],"title":"ExportedReport","description":"Container for a chargeback report in a specific export format.\n\nThe ``content`` field holds either:\n* A JSON string (when ``format == \"json\"``) representing the\n  :class:`ChargebackReport` for the tenant, or\n* A UTF-8 CSV string (when ``format == \"csv\"``) with one row per\n  allocation line.\n\n``report`` is populated for JSON exports so callers can consume the\nstructured data without re-parsing ``content``."},"GuestAccount":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"tenant_name":{"type":"string","title":"Tenant Name"},"user_principal_name":{"type":"string","title":"User Principal Name"},"display_name":{"type":"string","title":"Display Name"},"invited_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invited By"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"last_sign_in":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Sign In"},"is_stale":{"type":"boolean","title":"Is Stale","default":false},"days_inactive":{"type":"integer","title":"Days Inactive","default":0}},"type":"object","required":["tenant_id","tenant_name","user_principal_name","display_name"],"title":"GuestAccount","description":"Guest account details."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IdentitySummary":{"properties":{"total_users":{"type":"integer","title":"Total Users"},"active_users":{"type":"integer","title":"Active Users"},"guest_users":{"type":"integer","title":"Guest Users"},"mfa_enabled_percent":{"type":"number","title":"Mfa Enabled Percent"},"privileged_users":{"type":"integer","title":"Privileged Users"},"stale_accounts":{"type":"integer","title":"Stale Accounts"},"service_principals":{"type":"integer","title":"Service Principals"},"by_tenant":{"items":{"$ref":"#/components/schemas/TenantIdentitySummary"},"type":"array","title":"By Tenant"}},"type":"object","required":["total_users","active_users","guest_users","mfa_enabled_percent","privileged_users","stale_accounts","service_principals"],"title":"IdentitySummary","description":"Identity governance summary across tenants.","examples":[{"active_users":980,"by_tenant":[],"guest_users":45,"mfa_enabled_percent":94.5,"privileged_users":12,"service_principals":34,"stale_accounts":67,"total_users":1250}]},"IdleResource":{"properties":{"id":{"type":"integer","title":"Id"},"resource_id":{"type":"string","title":"Resource Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"tenant_name":{"type":"string","title":"Tenant Name"},"subscription_id":{"type":"string","title":"Subscription Id"},"detected_at":{"type":"string","format":"date-time","title":"Detected At"},"idle_type":{"type":"string","title":"Idle Type"},"description":{"type":"string","title":"Description"},"estimated_monthly_savings":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimated Monthly Savings"},"idle_days":{"type":"integer","title":"Idle Days"},"is_reviewed":{"type":"boolean","title":"Is Reviewed","default":false},"reviewed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reviewed By"},"reviewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reviewed At"},"review_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Notes"}},"type":"object","required":["id","resource_id","tenant_id","tenant_name","subscription_id","detected_at","idle_type","description","estimated_monthly_savings","idle_days"],"title":"IdleResource","description":"Idle resource details."},"IdleResourceSummary":{"properties":{"total_count":{"type":"integer","title":"Total Count"},"total_potential_savings_monthly":{"type":"number","title":"Total Potential Savings Monthly"},"total_potential_savings_annual":{"type":"number","title":"Total Potential Savings Annual"},"by_type":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Type"},"by_tenant":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Tenant"}},"type":"object","required":["total_count","total_potential_savings_monthly","total_potential_savings_annual"],"title":"IdleResourceSummary","description":"Summary of idle resources."},"ImplementationEffort":{"type":"string","enum":["Low","Medium","High"],"title":"ImplementationEffort","description":"Implementation effort levels."},"LogoutResponse":{"properties":{"message":{"type":"string","title":"Message"},"revoked":{"type":"boolean","title":"Revoked"}},"type":"object","required":["message","revoked"],"title":"LogoutResponse","description":"Logout response."},"MissingTags":{"properties":{"resource_id":{"type":"string","title":"Resource Id"},"resource_name":{"type":"string","title":"Resource Name"},"resource_type":{"type":"string","title":"Resource Type"},"missing_tags":{"items":{"type":"string"},"type":"array","title":"Missing Tags"}},"type":"object","required":["resource_id","resource_name","resource_type","missing_tags"],"title":"MissingTags","description":"Resources with missing required tags."},"OrphanedResource":{"properties":{"resource_id":{"type":"string","title":"Resource Id"},"resource_name":{"type":"string","title":"Resource Name"},"resource_type":{"type":"string","title":"Resource Type"},"tenant_name":{"type":"string","title":"Tenant Name"},"subscription_name":{"type":"string","title":"Subscription Name"},"estimated_monthly_cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimated Monthly Cost"},"days_inactive":{"type":"integer","title":"Days Inactive"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["resource_id","resource_name","resource_type","tenant_name","subscription_name","estimated_monthly_cost","days_inactive","reason"],"title":"OrphanedResource","description":"Orphaned resource details."},"PaginatedUsersResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/UserSummary"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"},"pages":{"type":"integer","title":"Pages"}},"type":"object","required":["items","total","page","per_page","pages"],"title":"PaginatedUsersResponse","description":"Paginated collection of users."},"PolicyStatus":{"properties":{"policy_definition_id":{"type":"string","title":"Policy Definition Id"},"policy_name":{"type":"string","title":"Policy Name"},"policy_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Category"},"compliance_state":{"type":"string","title":"Compliance State"},"non_compliant_count":{"type":"integer","title":"Non Compliant Count"},"tenant_id":{"type":"string","title":"Tenant Id"},"subscription_id":{"type":"string","title":"Subscription Id"},"severity":{"type":"string","title":"Severity","default":"Medium"},"recommendation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommendation"}},"type":"object","required":["policy_definition_id","policy_name","policy_category","compliance_state","non_compliant_count","tenant_id","subscription_id"],"title":"PolicyStatus","description":"Individual policy status."},"PolicyViolation":{"properties":{"policy_name":{"type":"string","title":"Policy Name"},"policy_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Category"},"violation_count":{"type":"integer","title":"Violation Count"},"affected_tenants":{"type":"integer","title":"Affected Tenants"},"severity":{"type":"string","title":"Severity","default":"Medium"}},"type":"object","required":["policy_name","policy_category","violation_count","affected_tenants"],"title":"PolicyViolation","description":"Top policy violations.","examples":[{"affected_tenants":3,"policy_category":"Tags","policy_name":"Require tag on resources","severity":"Medium","violation_count":23}]},"PreflightCheckRequest":{"properties":{"categories":{"anyOf":[{"items":{"$ref":"#/components/schemas/CheckCategory"},"type":"array"},{"type":"null"}],"title":"Categories","description":"Categories to check. If None, all categories will be checked."},"tenant_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tenant Ids","description":"Specific tenant IDs to check. If None, all active tenants will be checked."},"fail_fast":{"type":"boolean","title":"Fail Fast","description":"Stop on first failure. If True, the runner will stop executing checks after the first failure.","default":false},"timeout_seconds":{"type":"number","title":"Timeout Seconds","description":"Timeout for each individual check in seconds.","default":30.0}},"type":"object","title":"PreflightCheckRequest","description":"Request model for running preflight checks."},"PreflightReport":{"properties":{"id":{"type":"string","title":"Id","description":"Unique identifier for this report"},"started_at":{"type":"string","format":"date-time","title":"Started At","description":"When the check run started"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At","description":"When the check run completed"},"results":{"items":{"$ref":"#/components/schemas/CheckResult"},"type":"array","title":"Results","description":"Results of all checks"},"categories_requested":{"items":{"$ref":"#/components/schemas/CheckCategory"},"type":"array","title":"Categories Requested","description":"Categories that were checked"},"fail_fast":{"type":"boolean","title":"Fail Fast","description":"Whether fail-fast mode was enabled","default":false}},"type":"object","required":["id"],"title":"PreflightReport","description":"Complete preflight check report."},"PreflightStatusResponse":{"properties":{"latest_report":{"anyOf":[{"$ref":"#/components/schemas/PreflightReport"},{"type":"null"}],"description":"The most recent preflight report"},"last_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Run At","description":"When the last check run was initiated"},"is_running":{"type":"boolean","title":"Is Running","description":"Whether checks are currently running","default":false}},"type":"object","title":"PreflightStatusResponse","description":"Response model for preflight status endpoint."},"PrivilegedAccount":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"tenant_name":{"type":"string","title":"Tenant Name"},"user_principal_name":{"type":"string","title":"User Principal Name"},"display_name":{"type":"string","title":"Display Name"},"user_type":{"type":"string","title":"User Type"},"role_name":{"type":"string","title":"Role Name"},"role_scope":{"type":"string","title":"Role Scope"},"is_permanent":{"type":"boolean","title":"Is Permanent"},"mfa_enabled":{"type":"boolean","title":"Mfa Enabled"},"last_sign_in":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Sign In"},"risk_level":{"type":"string","title":"Risk Level","default":"Medium"}},"type":"object","required":["tenant_id","tenant_name","user_principal_name","display_name","user_type","role_name","role_scope","is_permanent","mfa_enabled"],"title":"PrivilegedAccount","description":"Privileged account details."},"Recommendation":{"properties":{"id":{"type":"integer","title":"Id"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"tenant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Name"},"subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Id"},"category":{"$ref":"#/components/schemas/RecommendationCategory"},"recommendation_type":{"type":"string","title":"Recommendation Type"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"impact":{"$ref":"#/components/schemas/RecommendationImpact"},"potential_savings_monthly":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Potential Savings Monthly"},"potential_savings_annual":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Potential Savings Annual"},"resource_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Id"},"resource_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Name"},"resource_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Type"},"current_state":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Current State"},"recommended_state":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Recommended State"},"implementation_effort":{"$ref":"#/components/schemas/ImplementationEffort"},"is_dismissed":{"type":"boolean","title":"Is Dismissed","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","category","recommendation_type","title","description","impact","implementation_effort","created_at","updated_at"],"title":"Recommendation","description":"Optimization or governance recommendation."},"RecommendationCategory":{"type":"string","enum":["cost_optimization","security","performance","reliability"],"title":"RecommendationCategory","description":"Recommendation categories."},"RecommendationImpact":{"type":"string","enum":["Low","Medium","High","Critical"],"title":"RecommendationImpact","description":"Recommendation impact levels."},"RecommendationSummary":{"properties":{"category":{"$ref":"#/components/schemas/RecommendationCategory"},"count":{"type":"integer","title":"Count"},"potential_savings_monthly":{"type":"number","title":"Potential Savings Monthly"},"potential_savings_annual":{"type":"number","title":"Potential Savings Annual"},"by_impact":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Impact"}},"type":"object","required":["category","count","potential_savings_monthly","potential_savings_annual"],"title":"RecommendationSummary","description":"Summary of recommendations by category."},"RecommendationsByCategory":{"properties":{"category":{"$ref":"#/components/schemas/RecommendationCategory"},"recommendations":{"items":{"$ref":"#/components/schemas/Recommendation"},"type":"array","title":"Recommendations"},"count":{"type":"integer","title":"Count"},"total_potential_savings_monthly":{"type":"number","title":"Total Potential Savings Monthly"}},"type":"object","required":["category","recommendations","count","total_potential_savings_monthly"],"title":"RecommendationsByCategory","description":"Recommendations grouped by category."},"RefreshTokenRequest":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"RefreshTokenRequest","description":"Refresh token request."},"ReservationSummary":{"properties":{"reservation_id":{"type":"string","title":"Reservation Id","description":"Azure reservation resource ID"},"reservation_order_id":{"type":"string","title":"Reservation Order Id","description":"Reservation order GUID"},"sku_name":{"type":"string","title":"Sku Name","description":"Azure SKU name (e.g. Standard_D2s_v3)"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind","description":"Reservation kind (e.g. Microsoft.Compute)"},"used_hours":{"type":"number","title":"Used Hours","description":"Actual consumed hours in the period"},"reserved_hours":{"type":"number","title":"Reserved Hours","description":"Total reserved hours in the period"},"utilization_percentage":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Utilization Percentage","description":"used_hours / reserved_hours × 100"},"usage_date":{"type":"string","format":"date","title":"Usage Date","description":"Date of the utilisation record (daily) or period start (monthly)"}},"type":"object","required":["reservation_id","reservation_order_id","sku_name","used_hours","reserved_hours","utilization_percentage","usage_date"],"title":"ReservationSummary","description":"A single reservation utilisation data point from the Consumption API.\n\nMaps to one item in the ``value`` array of the reservationSummaries\nREST response."},"ReservationSummaryResponse":{"properties":{"available":{"type":"boolean","title":"Available","description":"Whether reservation utilisation data is accessible for this tenant"},"grain":{"anyOf":[{"type":"string","enum":["daily","monthly"]},{"type":"null"}],"title":"Grain","description":"Granularity of the returned summaries"},"summaries":{"items":{"$ref":"#/components/schemas/ReservationSummary"},"type":"array","title":"Summaries","description":"Reservation utilisation records returned by the Consumption API"},"aggregate":{"anyOf":[{"$ref":"#/components/schemas/ReservationUtilizationSummary"},{"type":"null"}],"description":"Computed aggregate statistics; None when available=False"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Machine-readable reason code when available=False"},"setup_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Setup Instructions","description":"Human-readable onboarding guidance when available=False"}},"type":"object","required":["available"],"title":"ReservationSummaryResponse","description":"Reservation utilisation API response.\n\n``available`` is the primary signal:\n- ``True``  → billing account scope was reachable; ``summaries`` is populated\n- ``False`` → scope is unavailable; ``reason`` and ``setup_instructions`` explain why"},"ReservationUtilizationSummary":{"properties":{"total_reservations":{"type":"integer","title":"Total Reservations","description":"Number of distinct reservations"},"avg_utilization_percent":{"type":"number","title":"Avg Utilization Percent","description":"Mean utilisation across all records"},"underutilized_count":{"type":"integer","title":"Underutilized Count","description":"Reservations below the underutilisation threshold"},"underutilization_threshold":{"type":"number","title":"Underutilization Threshold","description":"Threshold (%) below which a reservation is underutilised","default":80.0}},"type":"object","required":["total_reservations","avg_utilization_percent","underutilized_count"],"title":"ReservationUtilizationSummary","description":"Aggregate statistics computed over all returned reservation summaries."},"ResourceFilterCriteria":{"properties":{"tenant_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tenant Ids"},"resource_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Resource Types"},"subscription_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Subscription Ids"},"resource_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Group"},"tag_criteria":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Tag Criteria"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"}},"type":"object","title":"ResourceFilterCriteria","description":"Filter criteria for bulk resource operations."},"ResourceGroupCost":{"properties":{"resource_group":{"type":"string","title":"Resource Group","description":"Azure resource group name"},"cost_amount":{"type":"number","minimum":0.0,"title":"Cost Amount"},"percentage":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Percentage","description":"Percentage of tenant total"}},"type":"object","required":["resource_group","cost_amount","percentage"],"title":"ResourceGroupCost","description":"Cost breakdown for a single resource group."},"ResourceInventory":{"properties":{"total_resources":{"type":"integer","title":"Total Resources"},"resources_by_type":{"additionalProperties":{"type":"integer"},"type":"object","title":"Resources By Type"},"resources_by_location":{"additionalProperties":{"type":"integer"},"type":"object","title":"Resources By Location"},"resources_by_tenant":{"additionalProperties":{"type":"integer"},"type":"object","title":"Resources By Tenant"},"orphaned_resources":{"type":"integer","title":"Orphaned Resources"},"orphaned_estimated_cost":{"type":"number","title":"Orphaned Estimated Cost"},"resources":{"items":{"$ref":"#/components/schemas/ResourceItem"},"type":"array","title":"Resources"}},"type":"object","required":["total_resources","orphaned_resources","orphaned_estimated_cost"],"title":"ResourceInventory","description":"Resource inventory summary."},"ResourceItem":{"properties":{"id":{"type":"string","title":"Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"tenant_name":{"type":"string","title":"Tenant Name"},"subscription_id":{"type":"string","title":"Subscription Id"},"subscription_name":{"type":"string","title":"Subscription Name"},"resource_group":{"type":"string","title":"Resource Group"},"resource_type":{"type":"string","title":"Resource Type"},"name":{"type":"string","title":"Name"},"location":{"type":"string","title":"Location"},"provisioning_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provisioning State"},"sku":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sku"},"tags":{"additionalProperties":{"type":"string"},"type":"object","title":"Tags"},"is_orphaned":{"type":"boolean","title":"Is Orphaned","default":false},"estimated_monthly_cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Estimated Monthly Cost"},"last_synced":{"type":"string","format":"date-time","title":"Last Synced"}},"type":"object","required":["id","tenant_id","tenant_name","subscription_id","subscription_name","resource_group","resource_type","name","location","last_synced"],"title":"ResourceItem","description":"Individual resource in inventory.","examples":[{"estimated_monthly_cost":13.14,"id":"rsc-abc123","is_orphaned":false,"last_synced":"2025-05-25T10:30:00Z","location":"eastus","name":"app-governance-prod","provisioning_state":"Succeeded","resource_group":"rg-app-prod","resource_type":"Microsoft.Web/sites","sku":"B1","subscription_id":"sub-prod-001","subscription_name":"HTT Production","tags":{"environment":"production","owner":"platform-team"},"tenant_id":"tenant-htt-001","tenant_name":"HTT Brands"}]},"ResourceTypeCost":{"properties":{"resource_type":{"type":"string","title":"Resource Type","description":"Azure service name / meter category"},"cost_amount":{"type":"number","minimum":0.0,"title":"Cost Amount"},"percentage":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Percentage","description":"Percentage of tenant total"}},"type":"object","required":["resource_type","cost_amount","percentage"],"title":"ResourceTypeCost","description":"Cost breakdown for a single resource type (service)."},"ReviewActionRequest":{"properties":{"action":{"type":"string","enum":["approve","revoke"],"title":"Action","description":"Action to take: 'approve' (keep assignment) or 'revoke' (remove it)"}},"type":"object","required":["action"],"title":"ReviewActionRequest","description":"Request body for POST /access-reviews/{review_id}/action."},"RoleDetailResponse":{"properties":{"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"description":{"type":"string","title":"Description"},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions"},"permission_count":{"type":"integer","title":"Permission Count"}},"type":"object","required":["name","slug","description","permissions","permission_count"],"title":"RoleDetailResponse","description":"Detailed role information with its permission set."},"RolesUpdateRequest":{"properties":{"roles":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Roles","description":"List of role slugs (e.g. ['analyst', 'viewer'])","examples":[["tenant_admin"],["analyst","viewer"]]}},"type":"object","required":["roles"],"title":"RolesUpdateRequest","description":"Request body for updating a user's roles."},"SavingsPotential":{"properties":{"total_potential_savings_monthly":{"type":"number","title":"Total Potential Savings Monthly"},"total_potential_savings_annual":{"type":"number","title":"Total Potential Savings Annual"},"by_category":{"additionalProperties":{"type":"number"},"type":"object","title":"By Category"},"by_tenant":{"additionalProperties":{"type":"number"},"type":"object","title":"By Tenant"}},"type":"object","required":["total_potential_savings_monthly","total_potential_savings_annual"],"title":"SavingsPotential","description":"Total potential savings across all recommendations."},"SearchResult":{"properties":{"id":{"type":"string","title":"Id"},"type":{"$ref":"#/components/schemas/SearchResultType"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"url":{"type":"string","title":"Url"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","required":["id","type","title","description","url"],"title":"SearchResult","description":"Unified search result."},"SearchResultType":{"type":"string","enum":["tenant","resource","alert","compliance"],"title":"SearchResultType"},"ServiceCost":{"properties":{"service_name":{"type":"string","title":"Service Name"},"cost":{"type":"number","title":"Cost"},"percentage_of_total":{"type":"number","title":"Percentage Of Total"}},"type":"object","required":["service_name","cost","percentage_of_total"],"title":"ServiceCost","description":"Cost breakdown by service."},"ServicePlanDetail":{"properties":{"service_plan_id":{"type":"string","title":"Service Plan Id","description":"GUID of the service plan"},"service_plan_name":{"type":"string","title":"Service Plan Name","description":"Human-readable service plan name, e.g. 'EXCHANGE_S_ENTERPRISE'"},"provisioning_status":{"type":"string","title":"Provisioning Status","description":"Provisioning status: Success, Disabled, PendingInput, etc."},"applies_to":{"type":"string","title":"Applies To","description":"Who the plan applies to: User or Company","default":"User"}},"type":"object","required":["service_plan_id","service_plan_name","provisioning_status"],"title":"ServicePlanDetail","description":"Details for a single service plan within a license SKU assignment."},"StaleAccount":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"tenant_name":{"type":"string","title":"Tenant Name"},"user_principal_name":{"type":"string","title":"User Principal Name"},"display_name":{"type":"string","title":"Display Name"},"user_type":{"type":"string","title":"User Type"},"last_sign_in":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Sign In"},"days_inactive":{"type":"integer","title":"Days Inactive"},"has_licenses":{"type":"boolean","title":"Has Licenses"},"has_privileged_roles":{"type":"boolean","title":"Has Privileged Roles"}},"type":"object","required":["tenant_id","tenant_name","user_principal_name","display_name","user_type","days_inactive","has_licenses","has_privileged_roles"],"title":"StaleAccount","description":"Stale account details."},"SubscriptionCost":{"properties":{"subscription_id":{"type":"string","title":"Subscription Id"},"subscription_name":{"type":"string","title":"Subscription Name"},"cost":{"type":"number","title":"Cost"}},"type":"object","required":["subscription_id","subscription_name","cost"],"title":"SubscriptionCost","description":"Cost per subscription."},"SubscriptionResponse":{"properties":{"id":{"type":"string","maxLength":36,"minLength":36,"title":"Id"},"subscription_id":{"type":"string","maxLength":36,"minLength":36,"title":"Subscription Id"},"display_name":{"type":"string","title":"Display Name"},"state":{"type":"string","title":"State"},"tenant_id":{"type":"string","title":"Tenant Id"},"synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Synced At"}},"type":"object","required":["id","subscription_id","display_name","state","tenant_id"],"title":"SubscriptionResponse","description":"Schema for subscription response."},"TagOperationResult":{"properties":{"resource_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Id"},"resource_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Name"},"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["resource_id","resource_name","success","message"],"title":"TagOperationResult","description":"Result of a single tag operation."},"TagResourceRequest":{"properties":{"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"TagResourceRequest","description":"Request to tag a resource as reviewed."},"TagResourceResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"resource_id":{"type":"string","title":"Resource Id"},"tagged_at":{"type":"string","format":"date-time","title":"Tagged At"}},"type":"object","required":["success","resource_id","tagged_at"],"title":"TagResourceResponse","description":"Response after tagging a resource."},"TaggingCompliance":{"properties":{"total_resources":{"type":"integer","title":"Total Resources"},"fully_tagged":{"type":"integer","title":"Fully Tagged"},"partially_tagged":{"type":"integer","title":"Partially Tagged"},"untagged":{"type":"integer","title":"Untagged"},"compliance_percent":{"type":"number","title":"Compliance Percent"},"required_tags":{"items":{"type":"string"},"type":"array","title":"Required Tags"},"missing_tags_by_resource":{"items":{"$ref":"#/components/schemas/MissingTags"},"type":"array","title":"Missing Tags By Resource"}},"type":"object","required":["total_resources","fully_tagged","partially_tagged","untagged","compliance_percent"],"title":"TaggingCompliance","description":"Tagging compliance summary."},"TenantCheckSummary":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"tenant_name":{"type":"string","title":"Tenant Name"},"checks_passed":{"type":"integer","title":"Checks Passed"},"checks_failed":{"type":"integer","title":"Checks Failed"},"checks_warning":{"type":"integer","title":"Checks Warning"},"checks_skipped":{"type":"integer","title":"Checks Skipped"},"overall_status":{"$ref":"#/components/schemas/CheckStatus"},"results":{"items":{"$ref":"#/components/schemas/CheckResult"},"type":"array","title":"Results"}},"type":"object","required":["tenant_id","tenant_name","checks_passed","checks_failed","checks_warning","checks_skipped","overall_status","results"],"title":"TenantCheckSummary","description":"Summary of checks for a specific tenant."},"TenantCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"pattern":"^[\\w\\s\\-_.]+$","title":"Name"},"tenant_id":{"type":"string","maxLength":36,"minLength":36,"title":"Tenant Id"},"client_id":{"anyOf":[{"type":"string","maxLength":36,"minLength":36},{"type":"null"}],"title":"Client Id"},"client_secret_ref":{"anyOf":[{"type":"string","maxLength":500,"pattern":"^[\\w\\-_.]+$"},{"type":"null"}],"title":"Client Secret Ref"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"use_lighthouse":{"type":"boolean","title":"Use Lighthouse","default":false}},"type":"object","required":["name","tenant_id"],"title":"TenantCreate","description":"Schema for creating a new tenant.\n\nSECURITY: All Azure IDs are validated as proper UUIDs."},"TenantIdentitySummary":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"tenant_name":{"type":"string","title":"Tenant Name"},"total_users":{"type":"integer","title":"Total Users"},"guest_users":{"type":"integer","title":"Guest Users"},"mfa_enabled_percent":{"type":"number","title":"Mfa Enabled Percent"},"privileged_users":{"type":"integer","title":"Privileged Users"},"stale_accounts_30d":{"type":"integer","title":"Stale Accounts 30D"},"stale_accounts_90d":{"type":"integer","title":"Stale Accounts 90D"}},"type":"object","required":["tenant_id","tenant_name","total_users","guest_users","mfa_enabled_percent","privileged_users","stale_accounts_30d","stale_accounts_90d"],"title":"TenantIdentitySummary","description":"Identity summary for a single tenant."},"TenantResponse":{"properties":{"id":{"type":"string","maxLength":36,"minLength":36,"title":"Id"},"name":{"type":"string","title":"Name"},"tenant_id":{"type":"string","maxLength":36,"minLength":36,"title":"Tenant Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_active":{"type":"boolean","title":"Is Active"},"use_lighthouse":{"type":"boolean","title":"Use Lighthouse"},"subscription_count":{"type":"integer","title":"Subscription Count","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","tenant_id","is_active","use_lighthouse","created_at","updated_at"],"title":"TenantResponse","description":"Schema for tenant response."},"TenantUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1,"pattern":"^[\\w\\s\\-_.]+$"},{"type":"null"}],"title":"Name"},"client_id":{"anyOf":[{"type":"string","maxLength":36,"minLength":36},{"type":"null"}],"title":"Client Id"},"client_secret_ref":{"anyOf":[{"type":"string","maxLength":500,"pattern":"^[\\w\\-_.]+$"},{"type":"null"}],"title":"Client Secret Ref"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"use_lighthouse":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Lighthouse"}},"type":"object","title":"TenantUpdate","description":"Schema for updating a tenant.\n\nSECURITY: All Azure IDs are validated as proper UUIDs."},"TokenResponse":{"properties":{"access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In"},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"},"cookies_set":{"type":"boolean","title":"Cookies Set","default":true}},"type":"object","required":["expires_in"],"title":"TokenResponse","description":"OAuth2 token response."},"TouchTargetReport":{"properties":{"compliant":{"type":"boolean","title":"Compliant"},"total_elements":{"type":"integer","title":"Total Elements"},"violations":{"items":{"$ref":"#/components/schemas/TouchTargetViolation"},"type":"array","title":"Violations"},"score":{"type":"number","title":"Score"}},"type":"object","required":["compliant","total_elements","violations","score"],"title":"TouchTargetReport","description":"Report of touch target compliance."},"TouchTargetViolation":{"properties":{"element":{"type":"string","title":"Element"},"selector":{"type":"string","title":"Selector"},"actual_width":{"type":"number","title":"Actual Width"},"actual_height":{"type":"number","title":"Actual Height"},"required_min":{"type":"number","title":"Required Min","default":24.0},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"}},"type":"object","required":["element","selector","actual_width","actual_height"],"title":"TouchTargetViolation","description":"A touch target that doesn't meet WCAG 2.5.8 minimum size."},"UpdateRuleRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"},"rule_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rule Schema"},"is_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Enabled"}},"type":"object","title":"UpdateRuleRequest"},"UserAccount":{"properties":{"id":{"type":"string","title":"Id","description":"Azure AD user object ID"},"tenant_id":{"type":"string","title":"Tenant Id"},"tenant_name":{"type":"string","title":"Tenant Name"},"user_principal_name":{"type":"string","title":"User Principal Name"},"display_name":{"type":"string","title":"Display Name"},"user_type":{"type":"string","title":"User Type","description":"Member or Guest","default":"Member"},"account_enabled":{"type":"boolean","title":"Account Enabled","default":true},"mfa_enabled":{"type":"boolean","title":"Mfa Enabled","default":false},"last_sign_in":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Sign In"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Title"},"department":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Department"},"office_location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Office Location"}},"type":"object","required":["id","tenant_id","tenant_name","user_principal_name","display_name"],"title":"UserAccount","description":"Basic user account details."},"UserDetailResponse":{"properties":{"user_id":{"type":"string","title":"User Id"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles"},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions"},"tenant_access":{"items":{"$ref":"#/components/schemas/UserTenantAccessInfo"},"type":"array","title":"Tenant Access"}},"type":"object","required":["user_id","roles","permissions","tenant_access"],"title":"UserDetailResponse","description":"Full user profile with roles, permissions, and tenant access."},"UserInfoResponse":{"properties":{"id":{"type":"string","title":"Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles"},"tenant_ids":{"items":{"type":"string"},"type":"array","title":"Tenant Ids"},"accessible_tenants":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Accessible Tenants","default":[]},"auth_provider":{"type":"string","title":"Auth Provider"},"is_active":{"type":"boolean","title":"Is Active"}},"type":"object","required":["id","roles","tenant_ids","auth_provider","is_active"],"title":"UserInfoResponse","description":"Current user info response."},"UserLicense":{"properties":{"user_id":{"type":"string","title":"User Id","description":"Azure AD object ID of the user"},"user_principal_name":{"type":"string","title":"User Principal Name","description":"UPN of the user, e.g. alice@contoso.com"},"display_name":{"type":"string","title":"Display Name","description":"Display name of the user"},"sku_id":{"type":"string","title":"Sku Id","description":"GUID of the license SKU"},"sku_part_number":{"type":"string","title":"Sku Part Number","description":"Human-readable SKU identifier, e.g. 'ENTERPRISEPREMIUM' (E5)"},"service_plans":{"items":{"$ref":"#/components/schemas/ServicePlanDetail"},"type":"array","title":"Service Plans","description":"Service plans included in this SKU assignment"}},"type":"object","required":["user_id","user_principal_name","display_name","sku_id","sku_part_number"],"title":"UserLicense","description":"A single license SKU assignment for one user.\n\nReturned by ``GET /users/{id}/licenseDetails``, enriched with\nthe user's identity fields."},"UserLicenseSummary":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id","description":"Azure tenant ID"},"user_id":{"type":"string","title":"User Id","description":"Azure AD object ID of the user"},"user_principal_name":{"type":"string","title":"User Principal Name","description":"UPN of the user"},"display_name":{"type":"string","title":"Display Name","description":"Display name of the user"},"assigned_sku_ids":{"items":{"type":"string"},"type":"array","title":"Assigned Sku Ids","description":"List of assigned license SKU GUIDs"},"assigned_sku_part_numbers":{"items":{"type":"string"},"type":"array","title":"Assigned Sku Part Numbers","description":"List of human-readable SKU part numbers, e.g. ['ENTERPRISEPREMIUM']"},"license_count":{"type":"integer","title":"License Count","description":"Total number of licenses assigned","default":0}},"type":"object","required":["tenant_id","user_id","user_principal_name","display_name"],"title":"UserLicenseSummary","description":"Aggregated license summary for a single user across all their SKU assignments.\n\nUsed by ``list_tenant_licenses`` which enumerates all licensed users\nwithout fetching per-user ``licenseDetails`` (cost-efficient)."},"UserSummary":{"properties":{"user_id":{"type":"string","title":"User Id"},"tenant_count":{"type":"integer","title":"Tenant Count"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles"},"is_active":{"type":"boolean","title":"Is Active"}},"type":"object","required":["user_id","tenant_count","roles","is_active"],"title":"UserSummary","description":"Compact user representation for list endpoints."},"UserTenantAccessInfo":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"tenant_name":{"type":"string","title":"Tenant Name"},"role":{"type":"string","title":"Role"},"is_active":{"type":"boolean","title":"Is Active"},"can_manage_resources":{"type":"boolean","title":"Can Manage Resources"},"can_view_costs":{"type":"boolean","title":"Can View Costs"},"can_manage_compliance":{"type":"boolean","title":"Can Manage Compliance"},"granted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Granted At"},"last_accessed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Accessed At"}},"type":"object","required":["tenant_id","tenant_name","role","is_active","can_manage_resources","can_view_costs","can_manage_compliance"],"title":"UserTenantAccessInfo","description":"Per-tenant access details for a user."},"ValidateResourceRequest":{"properties":{"resource_id":{"type":"string","title":"Resource Id","description":"Azure resource ID"},"resource_name":{"type":"string","title":"Resource Name","description":"Resource display name"},"resource_type":{"type":"string","title":"Resource Type","description":"Azure resource type"},"region":{"type":"string","title":"Region","description":"Azure region/location","default":""},"tags":{"additionalProperties":{"type":"string"},"type":"object","title":"Tags","description":"Resource tags"},"sku":{"type":"string","title":"Sku","description":"Resource SKU name","default":""}},"type":"object","required":["resource_id","resource_name","resource_type"],"title":"ValidateResourceRequest","description":"Request body for resource validation."},"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"}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"JWT token obtained from Azure AD OAuth2 flow"},"oauth2":{"type":"oauth2","flows":{"authorizationCode":{"authorizationUrl":"https://login.microsoftonline.com/common/oauth2/v2.0/authorize","tokenUrl":"https://login.microsoftonline.com/common/oauth2/v2.0/token","refreshUrl":"https://login.microsoftonline.com/common/oauth2/v2.0/token","scopes":{"openid":"Authenticate user identity","profile":"Access user profile","email":"Access user email","User.Read":"Read user profile from Microsoft Graph"}}},"description":"Azure AD OAuth2 authentication"},"apiKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API key for service-to-service authentication"}}},"tags":[{"name":"Authentication","description":"OAuth2 and token-based authentication endpoints"},{"name":"Dashboard","description":"Dashboard summaries and overview metrics"},{"name":"Costs","description":"Cost analysis, budgets, and spending reports"},{"name":"Compliance","description":"Compliance status, frameworks, and rule management"},{"name":"Resources","description":"Azure resource inventory and lifecycle management"},{"name":"Identity","description":"Identity governance, MFA, and access reviews"},{"name":"Sync","description":"Data synchronization jobs and scheduling"},{"name":"Riverside","description":"Riverside Company compliance tracking"},{"name":"DMARC","description":"Email security and DMARC monitoring"},{"name":"System","description":"Health checks, metrics, and system status"}],"security":[{"bearerAuth":[]},{"oauth2":["openid","profile","email","User.Read"]}],"externalDocs":{"description":"Full Documentation","url":"https://github.com/tygranlund/azure-governance-platform/tree/main/docs"},"servers":[{"url":"/","description":"Current server"},{"url":"https://api-staging.example.com","description":"Staging server"},{"url":"https://api.example.com","description":"Production server"}]}