{"components":{"responses":{},"schemas":{"ImportExecuteRequest":{"description":"Confirmed import with mappings","properties":{"account_mappings":{"description":"Map of source account name to account ID","type":"object"},"auto_create_accounts":{"default":false,"type":"boolean"},"auto_create_categories":{"default":false,"type":"boolean"},"category_mappings":{"description":"Map of source category name to category ID","type":"object"},"csv_content":{"description":"Raw CSV content","type":"string"},"default_currency":{"nullable":true,"type":"string"},"group_id":{"format":"uuid","nullable":true,"type":"string"},"skip_duplicates":{"default":true,"type":"boolean"}},"required":["csv_content"],"title":"ImportExecuteRequest","type":"object"},"ActivityLog":{"description":"An activity log entry","properties":{"description":{"nullable":true,"type":"string"},"event_type":{"type":"string"},"id":{"format":"uuid","type":"string"},"inserted_at":{"format":"date-time","type":"string"},"metadata":{"type":"object"},"resource_id":{"nullable":true,"type":"string"},"resource_type":{"type":"string"}},"required":["id","event_type","resource_type"],"title":"ActivityLog","type":"object"},"Streak":{"description":"Transaction tracking streak","properties":{"current_streak":{"description":"Current consecutive days","type":"integer"},"longest_streak":{"description":"Longest consecutive days","type":"integer"}},"required":["current_streak","longest_streak"],"title":"Streak","type":"object"},"Alert":{"description":"A transaction alert rule","properties":{"active":{"type":"boolean"},"currency":{"nullable":true,"type":"string"},"group_id":{"format":"uuid","nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"inserted_at":{"format":"date-time","type":"string"},"name":{"type":"string"},"predicate_type":{"enum":["amount_above","amount_below","category_match","description_match"],"type":"string"},"predicate_value":{"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","name","predicate_type","predicate_value"],"title":"Alert","type":"object"},"ApiKeyCreated":{"description":"Newly created API key with raw key (shown once)","properties":{"expires_at":{"format":"date-time","nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"inserted_at":{"format":"date-time","type":"string"},"key_prefix":{"type":"string"},"kind":{"enum":["user","app"],"type":"string"},"last_used_at":{"format":"date-time","nullable":true,"type":"string"},"name":{"type":"string"},"raw_key":{"description":"Full API key (shown only once)","type":"string"},"request_count":{"description":"Total API requests made with this key","type":"integer"}},"required":["id","name","key_prefix","kind","raw_key"],"title":"ApiKeyCreated","type":"object"},"DailyTotals":{"description":"Daily income/expense totals for charts","items":{"properties":{"amount":{"description":"Decimal amount","type":"string"},"date":{"format":"date","type":"string"},"type":{"enum":["income","expense"],"type":"string"}},"type":"object"},"title":"DailyTotals","type":"array"},"RecurringEntry":{"description":"A recurring income or expense entry","properties":{"amount":{"description":"Decimal amount","type":"string"},"category_id":{"format":"uuid","nullable":true,"type":"string"},"currency":{"type":"string"},"description":{"nullable":true,"type":"string"},"frequency":{"enum":["daily","weekly","biweekly","monthly","yearly"],"type":"string"},"group_id":{"format":"uuid","nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"inserted_at":{"format":"date-time","type":"string"},"is_active":{"type":"boolean"},"last_generated_date":{"format":"date","nullable":true,"type":"string"},"metadata":{"type":"object"},"next_date":{"format":"date","nullable":true,"type":"string"},"type":{"enum":["income","expense"],"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","amount","type","frequency"],"title":"RecurringEntry","type":"object"},"BudgetRecommendation":{"description":"Recommended budget amount based on historical spending","properties":{"avg_monthly":{"description":"Average monthly spending","type":"string"},"category":{"type":"string"},"currency":{"type":"string"},"max":{"type":"string"},"min":{"type":"string"},"months_analyzed":{"type":"integer"},"recommended":{"description":"Recommended budget amount","type":"string"},"trend":{"enum":["rising","stable","declining"],"type":"string"}},"required":["category","recommended","avg_monthly","months_analyzed"],"title":"BudgetRecommendation","type":"object"},"ParsingRuleRequest":{"description":"Parameters for creating or updating a parsing rule","properties":{"category_id":{"format":"uuid","type":"string"},"pattern":{"type":"string"},"priority":{"type":"integer"}},"title":"ParsingRuleRequest","type":"object"},"SavingsGoal":{"description":"Savings plan calculation","properties":{"currency":{"type":"string"},"current_monthly_savings":{"type":"string"},"feasible":{"type":"boolean"},"monthly_required":{"type":"string"},"months_remaining":{"type":"integer"},"shortfall":{"type":"string"},"target_amount":{"type":"string"},"target_date":{"format":"date","type":"string"}},"required":["monthly_required","months_remaining","feasible"],"title":"SavingsGoal","type":"object"},"ImportPreview":{"description":"CSV import preview with parsed rows and suggested mappings","properties":{"account_mappings":{"description":"Suggested account mappings","type":"object"},"category_mappings":{"description":"Suggested category mappings","type":"object"},"errors":{"items":{"properties":{"error":{"type":"string"},"row_number":{"type":"integer"}},"type":"object"},"type":"array"},"headers":{"items":{"type":"string"},"type":"array"},"provider":{"description":"Detected format provider","type":"string"},"rows":{"items":{"properties":{"account_name":{"nullable":true,"type":"string"},"amount":{"type":"string"},"category_name":{"nullable":true,"type":"string"},"currency":{"nullable":true,"type":"string"},"date":{"format":"date","type":"string"},"description":{"type":"string"},"type":{"enum":["income","expense"],"type":"string"}},"type":"object"},"type":"array"},"total_rows":{"type":"integer"}},"title":"ImportPreview","type":"object"},"Transaction":{"description":"A financial transaction","properties":{"amount":{"description":"Decimal amount","type":"string"},"category":{"nullable":true,"properties":{"id":{"format":"uuid","type":"string"},"name":{"type":"string"},"type":{"type":"string"}},"type":"object"},"category_id":{"format":"uuid","nullable":true,"type":"string"},"currency":{"nullable":true,"type":"string"},"date":{"format":"date","type":"string"},"description":{"nullable":true,"type":"string"},"group_id":{"format":"uuid","nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"inserted_at":{"format":"date-time","type":"string"},"metadata":{"type":"object"},"type":{"enum":["income","expense"],"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","amount","type","date"],"title":"Transaction","type":"object"},"RecurringEntryRequest":{"description":"Parameters for creating or updating a recurring entry","properties":{"amount":{"description":"Decimal amount (> 0)","type":"string"},"category_id":{"format":"uuid","type":"string"},"currency":{"type":"string"},"description":{"type":"string"},"frequency":{"enum":["daily","weekly","biweekly","monthly","yearly"],"type":"string"},"is_active":{"type":"boolean"},"metadata":{"type":"object"},"next_date":{"format":"date","type":"string"},"type":{"enum":["income","expense"],"type":"string"}},"title":"RecurringEntryRequest","type":"object"},"CashFlowForecast":{"description":"Financial position forecast for a future date","properties":{"currency":{"type":"string"},"days_ahead":{"type":"integer"},"expected_expenses":{"type":"string"},"expected_income":{"type":"string"},"forecast_date":{"format":"date","type":"string"},"projected_net":{"type":"string"},"recurring_expenses":{"type":"string"},"recurring_income":{"type":"string"}},"required":["forecast_date","projected_net"],"title":"CashFlowForecast","type":"object"},"Feedback":{"description":"A feedback submission","properties":{"category":{"enum":["bug","suggestion","other"],"type":"string"},"content":{"type":"string"},"id":{"format":"uuid","type":"string"},"inserted_at":{"format":"date-time","type":"string"},"source":{"enum":["web","telegram","api"],"type":"string"},"status":{"type":"string"},"tracking_number":{"nullable":true,"type":"string"}},"required":["id","content","category"],"title":"Feedback","type":"object"},"ParsingRule":{"description":"A text parsing rule for automatic categorization","properties":{"category_id":{"format":"uuid","type":"string"},"group_id":{"format":"uuid","nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"inserted_at":{"format":"date-time","type":"string"},"pattern":{"description":"Regex or text pattern to match","type":"string"},"priority":{"description":"Rule priority (higher = first)","type":"integer"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","pattern","priority","category_id"],"title":"ParsingRule","type":"object"},"SpendingProjection":{"description":"Projected month-end spending based on current pace","properties":{"category":{"nullable":true,"type":"string"},"currency":{"type":"string"},"daily_rate":{"description":"Average daily spending rate","type":"string"},"days_elapsed":{"type":"integer"},"days_remaining":{"type":"integer"},"pace":{"enum":["under","on_track","over"],"type":"string"},"projected":{"description":"Projected month-end expense","type":"string"},"vs_prev_pct":{"description":"% change vs last month","nullable":true,"type":"number"}},"required":["projected","daily_rate","days_elapsed","days_remaining","pace"],"title":"SpendingProjection","type":"object"},"Heatmap":{"description":"Transaction count per day for heatmap visualization","items":{"properties":{"count":{"type":"integer"},"date":{"format":"date","type":"string"}},"type":"object"},"title":"Heatmap","type":"array"},"SendMessageRequest":{"description":"Send a message to the chat assistant","properties":{"conversation_id":{"description":"Existing conversation ID to continue, or null for new","format":"uuid","nullable":true,"type":"string"},"message":{"description":"User message text","type":"string"}},"required":["message"],"title":"SendMessageRequest","type":"object"},"ConversationListItem":{"description":"A conversation without full message history","properties":{"id":{"format":"uuid","type":"string"},"inserted_at":{"format":"date-time","type":"string"},"message_count":{"type":"integer"},"model":{"nullable":true,"type":"string"},"title":{"nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","title"],"title":"ConversationListItem","type":"object"},"Conversation":{"description":"A chat conversation with message history","properties":{"id":{"format":"uuid","type":"string"},"inserted_at":{"format":"date-time","type":"string"},"messages":{"items":{"properties":{"content":{"type":"string"},"role":{"enum":["user","assistant"],"type":"string"}},"type":"object"},"type":"array"},"model":{"nullable":true,"type":"string"},"title":{"nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","title","messages"],"title":"Conversation","type":"object"},"ExchangeTokenRequest":{"description":"Request to exchange a Plaid public token","properties":{"metadata":{"description":"Metadata from Plaid Link onSuccess callback","nullable":true,"properties":{"accounts":{"items":{"type":"object"},"type":"array"},"institution":{"properties":{"institution_id":{"type":"string"},"name":{"type":"string"}},"type":"object"}},"type":"object"},"public_token":{"description":"Public token from Plaid Link","type":"string"}},"required":["public_token"],"title":"ExchangeTokenRequest","type":"object"},"LinkToken":{"description":"A Plaid Link token for initializing the Plaid Link flow","properties":{"link_token":{"type":"string"}},"required":["link_token"],"title":"LinkToken","type":"object"},"Ping":{"description":"API connection test response","properties":{"api_version":{"type":"string"},"status":{"enum":["ok"],"type":"string"},"timestamp":{"format":"date-time","type":"string"},"user":{"properties":{"currency":{"type":"string"},"id":{"format":"uuid","type":"string"},"language":{"type":"string"}},"type":"object"}},"required":["status","user","timestamp","api_version"],"title":"Ping","type":"object"},"Features":{"description":"Feature toggle states","properties":{"activity":{"type":"boolean"},"alerts":{"type":"boolean"},"budgets":{"type":"boolean"},"capital":{"type":"boolean"},"groups":{"type":"boolean"},"recurring":{"type":"boolean"},"rules":{"type":"boolean"}},"title":"Features","type":"object"},"GroupMember":{"description":"A group member","properties":{"id":{"format":"uuid","type":"string"},"joined_at":{"format":"date-time","type":"string"},"role":{"enum":["owner","member"],"type":"string"},"user_id":{"format":"uuid","type":"string"},"user_name":{"nullable":true,"type":"string"}},"required":["id","role","user_id"],"title":"GroupMember","type":"object"},"BillHistory":{"description":"Recurring bill payment history with missed payment detection","properties":{"currency":{"type":"string"},"results":{"items":{"properties":{"amount":{"type":"string"},"description":{"type":"string"},"missed_count":{"type":"integer"},"months":{"items":{"properties":{"month":{"type":"integer"},"status":{"enum":["paid","missed"],"type":"string"},"year":{"type":"integer"}},"type":"object"},"type":"array"}},"type":"object"},"type":"array"}},"title":"BillHistory","type":"object"},"CategoryRequest":{"description":"Parameters for creating or updating a category","properties":{"emoji":{"type":"string"},"name":{"type":"string"},"parent_id":{"format":"uuid","type":"string"},"type":{"enum":["income","expense"],"type":"string"}},"title":"CategoryRequest","type":"object"},"FeedbackRequest":{"description":"Parameters for submitting feedback","properties":{"category":{"enum":["bug","suggestion","other"],"type":"string"},"content":{"type":"string"}},"required":["content"],"title":"FeedbackRequest","type":"object"},"PlaidItem":{"description":"A Plaid bank connection item","properties":{"accounts":{"items":{"properties":{"available_balance":{"nullable":true,"type":"string"},"balance_limit":{"nullable":true,"type":"string"},"balance_updated_at":{"format":"date-time","nullable":true,"type":"string"},"current_balance":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"is_synced":{"type":"boolean"},"iso_currency_code":{"nullable":true,"type":"string"},"mask":{"nullable":true,"type":"string"},"name":{"type":"string"},"plaid_account_id":{"type":"string"},"subtype":{"nullable":true,"type":"string"},"type":{"type":"string"}},"type":"object"},"type":"array"},"consent_expires_at":{"format":"date-time","nullable":true,"type":"string"},"error_code":{"nullable":true,"type":"string"},"error_message":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"inserted_at":{"format":"date-time","type":"string"},"institution_id":{"type":"string"},"institution_name":{"type":"string"},"status":{"enum":["active","error","needs_reauth","pending_expiration","revoked"],"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","institution_name","status"],"title":"PlaidItem","type":"object"},"User":{"description":"User profile","properties":{"country":{"nullable":true,"type":"string"},"currency":{"type":"string"},"daily_reminders_enabled":{"type":"boolean"},"email":{"nullable":true,"type":"string"},"features":{"description":"Feature toggle map","type":"object"},"feedback_bubble_enabled":{"type":"boolean"},"first_name":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"inserted_at":{"format":"date-time","type":"string"},"language":{"type":"string"},"notifications_enabled":{"type":"boolean"},"reminder_hour":{"nullable":true,"type":"integer"},"role":{"type":"string"},"timezone":{"nullable":true,"type":"string"},"tips_enabled":{"type":"boolean"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","currency","language"],"title":"User","type":"object"},"Category":{"description":"A transaction category","properties":{"children":{"items":{"properties":{"emoji":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"name":{"type":"string"}},"type":"object"},"nullable":true,"type":"array"},"emoji":{"nullable":true,"type":"string"},"group_id":{"format":"uuid","nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"inserted_at":{"format":"date-time","type":"string"},"key":{"nullable":true,"type":"string"},"name":{"type":"string"},"parent_id":{"format":"uuid","nullable":true,"type":"string"},"type":{"enum":["income","expense"],"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","name","type"],"title":"Category","type":"object"},"SpendingPatterns":{"description":"Categories with significant spending changes vs average","properties":{"currency":{"type":"string"},"patterns":{"items":{"properties":{"average":{"type":"string"},"category":{"type":"string"},"change_pct":{"type":"number"},"current":{"type":"string"},"direction":{"enum":["spike","drop"],"type":"string"}},"type":"object"},"type":"array"},"threshold":{"type":"number"}},"title":"SpendingPatterns","type":"object"},"TransactionRequest":{"description":"Parameters for creating or updating a transaction","properties":{"amount":{"description":"Decimal amount (> 0)","type":"string"},"category_id":{"format":"uuid","type":"string"},"currency":{"type":"string"},"date":{"format":"date","type":"string"},"description":{"type":"string"},"metadata":{"type":"object"},"type":{"enum":["income","expense"],"type":"string"}},"title":"TransactionRequest","type":"object"},"SendMessageResponse":{"description":"AI assistant response","properties":{"conversation_id":{"format":"uuid","type":"string"},"response":{"description":"Assistant response content","type":"string"},"title":{"nullable":true,"type":"string"}},"required":["conversation_id","response"],"title":"SendMessageResponse","type":"object"},"Budget":{"description":"A spending budget","properties":{"active":{"type":"boolean"},"alert_threshold":{"type":"integer"},"amount":{"description":"Decimal amount","type":"string"},"category_id":{"format":"uuid","nullable":true,"type":"string"},"currency":{"type":"string"},"group_id":{"format":"uuid","nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"inserted_at":{"format":"date-time","type":"string"},"name":{"nullable":true,"type":"string"},"period":{"enum":["weekly","monthly","yearly"],"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","amount","period"],"title":"Budget","type":"object"},"CategoryBreakdown":{"description":"Spending/income breakdown by category","items":{"properties":{"amount":{"description":"Decimal amount","type":"string"},"category":{"type":"string"},"emoji":{"nullable":true,"type":"string"},"type":{"enum":["income","expense"],"type":"string"}},"type":"object"},"title":"CategoryBreakdown","type":"array"},"CapitalAsset":{"description":"A capital asset (property, vehicle, etc.)","properties":{"acquired_on":{"format":"date","nullable":true,"type":"string"},"asset_type":{"type":"string"},"currency":{"type":"string"},"gross_value":{"description":"Decimal amount","type":"string"},"group_id":{"format":"uuid","nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"inserted_at":{"format":"date-time","type":"string"},"liability":{"description":"Decimal amount","type":"string"},"metadata":{"type":"object"},"name":{"type":"string"},"notes":{"nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","name","asset_type","gross_value","liability"],"title":"CapitalAsset","type":"object"},"PeriodSummary":{"description":"Income/expense summary for a time period","properties":{"balance":{"description":"Decimal balance (income - expense)","type":"string"},"expense":{"description":"Decimal total expense","type":"string"},"income":{"description":"Decimal total income","type":"string"},"mixed_currencies":{"type":"boolean"}},"required":["income","expense","balance"],"title":"PeriodSummary","type":"object"},"Group":{"description":"A family/group budget","properties":{"emoji":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"inserted_at":{"format":"date-time","type":"string"},"name":{"type":"string"},"owner_id":{"format":"uuid","type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","name","owner_id"],"title":"Group","type":"object"},"ApiKey":{"description":"An API key (raw key never shown after creation)","properties":{"expires_at":{"format":"date-time","nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"inserted_at":{"format":"date-time","type":"string"},"key_prefix":{"description":"First characters of the key","type":"string"},"kind":{"enum":["user","app"],"type":"string"},"last_used_at":{"format":"date-time","nullable":true,"type":"string"},"name":{"type":"string"},"request_count":{"description":"Total API requests made with this key","type":"integer"}},"required":["id","name","key_prefix","kind"],"title":"ApiKey","type":"object"},"Insights":{"description":"Precomputed financial insights for the user","properties":{"insights":{"description":"List of insight strings (max 5)","items":{"type":"string"},"type":"array"}},"title":"Insights","type":"object"},"UserUpdateRequest":{"description":"Parameters for updating user settings","properties":{"country":{"type":"string"},"currency":{"type":"string"},"daily_reminders_enabled":{"type":"boolean"},"feedback_bubble_enabled":{"type":"boolean"},"language":{"type":"string"},"notifications_enabled":{"type":"boolean"},"reminder_hour":{"type":"integer"},"timezone":{"type":"string"},"tips_enabled":{"type":"boolean"}},"title":"UserUpdateRequest","type":"object"},"BudgetScorecard":{"description":"Monthly budget scorecard","items":{"properties":{"budget_id":{"format":"uuid","type":"string"},"budget_name":{"type":"string"},"limit":{"description":"Decimal budget limit","type":"string"},"percentage":{"description":"Percentage of budget used","type":"number"},"result":{"enum":["under","warning","over"],"type":"string"},"spent":{"description":"Decimal spent amount","type":"string"}},"type":"object"},"title":"BudgetScorecard","type":"array"},"ImportResult":{"description":"Result of CSV import execution","properties":{"errors":{"items":{"properties":{"error":{"type":"string"},"row_number":{"type":"integer"}},"type":"object"},"type":"array"},"imported":{"type":"integer"},"skipped":{"type":"integer"}},"title":"ImportResult","type":"object"},"PendingTransaction":{"description":"A pending Plaid transaction awaiting review","properties":{"amount":{"type":"string"},"category":{"nullable":true,"type":"object"},"date":{"format":"date","type":"string"},"id":{"format":"uuid","type":"string"},"merchant_name":{"nullable":true,"type":"string"},"name":{"type":"string"},"plaid_transaction_id":{"type":"string"},"status":{"type":"string"}},"required":["id","amount","date","name","status"],"title":"PendingTransaction","type":"object"}},"securitySchemes":{"bearer":{"description":"API key authentication. Generate a key in Settings > API Keys. Use the raw key (starts with sb_) as a Bearer token.","scheme":"bearer","type":"http"}}},"info":{"description":"REST API for Suma personal and family budget tracking.","title":"Suma API","version":"0.48.1"},"openapi":"3.0.0","paths":{"/api/v1/capital/summary":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.CapitalAssetController.summary","parameters":[],"responses":{"200":{"content":{"application/json":{}},"description":"Summary"}},"summary":"Net worth summary","tags":["Capital Assets"]}},"/api/v1/plaid/transactions/{id}/import":{"post":{"callbacks":{},"operationId":"SumaWeb.API.V1.PlaidController.import_transaction","parameters":[{"description":"Raw transaction ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"201":{"content":{"application/json":{}},"description":"Imported"}},"summary":"Import a pending transaction","tags":["Bank Connections (Plaid)"]}},"/api/v1/transactions":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.TransactionController.index","parameters":[{"description":"Page number","in":"query","name":"page","required":false,"schema":{"type":"integer"}},{"description":"Items per page (max 100)","in":"query","name":"per_page","required":false,"schema":{"type":"integer"}},{"description":"Filter by type (income/expense)","in":"query","name":"type","required":false,"schema":{"type":"string"}},{"description":"Filter by category ID","in":"query","name":"category_id","required":false,"schema":{"type":"string"}},{"description":"Search term","in":"query","name":"search","required":false,"schema":{"type":"string"}},{"description":"Sort field (date, amount, type)","in":"query","name":"sort_by","required":false,"schema":{"type":"string"}},{"description":"Sort direction (asc, desc)","in":"query","name":"sort_dir","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transaction"}}},"description":"Transactions list"}},"summary":"List transactions","tags":["Transactions"]},"post":{"callbacks":{},"operationId":"SumaWeb.API.V1.TransactionController.create","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionRequest"}}},"description":"Transaction params","required":false},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transaction"}}},"description":"Created transaction"},"422":{"content":{"application/json":{}},"description":"Validation error"}},"summary":"Create a transaction","tags":["Transactions"]}},"/api/v1/plaid/transactions/pending":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.PlaidController.pending_transactions","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PendingTransaction"}}},"description":"Pending transactions"}},"summary":"List pending bank transactions","tags":["Bank Connections (Plaid)"]}},"/api/v1/alerts":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.AlertController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Alert"}}},"description":"Alerts list"}},"summary":"List personal alerts","tags":["Alerts"]},"post":{"callbacks":{},"operationId":"SumaWeb.API.V1.AlertController.create","parameters":[],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Alert"}}},"description":"Created alert"},"422":{"content":{"application/json":{}},"description":"Validation error"}},"summary":"Create an alert","tags":["Alerts"]}},"/api/v1/recurring/{id}/toggle":{"put":{"callbacks":{},"operationId":"SumaWeb.API.V1.RecurringEntryController.toggle","parameters":[{"description":"","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringEntry"}}},"description":"Toggled"}},"summary":"Toggle active/inactive","tags":["Recurring Entries"]}},"/api/v1/groups/{id}/leave":{"delete":{"callbacks":{},"operationId":"SumaWeb.API.V1.GroupController.leave","parameters":[{"description":"","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{}},"description":"Left group"}},"summary":"Leave a group","tags":["Groups"]}},"/api/v1/budgets":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.BudgetController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Budget"}}},"description":"Budgets list"}},"summary":"List budgets","tags":["Budgets"]},"post":{"callbacks":{},"operationId":"SumaWeb.API.V1.BudgetController.create","parameters":[],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Budget"}}},"description":"Created budget"},"422":{"content":{"application/json":{}},"description":"Validation error"}},"summary":"Create a budget","tags":["Budgets"]}},"/api/v1/intelligence/cash-flow-forecast":{"get":{"callbacks":{},"description":"Forecast financial position on a future date using recurring entries and spending history.","operationId":"SumaWeb.API.V1.IntelligenceController.cash_flow_forecast","parameters":[{"description":"Target date (ISO 8601, default: end of month)","in":"query","name":"forecast_date","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CashFlowForecast"}}},"description":"Cash flow forecast"}},"summary":"Forecast cash flow","tags":["Intelligence"]}},"/api/v1/summary/heatmap":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.SummaryController.heatmap","parameters":[{"description":"Number of days back (default 365)","in":"query","name":"days","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Heatmap"}}},"description":"Heatmap data"}},"summary":"Transaction count heatmap","tags":["Summary"]}},"/api/v1/export/excel":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.ExportController.excel","parameters":[{"description":"","in":"query","name":"period","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{}},"description":"Excel binary"}},"summary":"Excel report download","tags":["Export"]}},"/api/v1/export/pdf":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.ExportController.pdf","parameters":[{"description":"","in":"query","name":"period","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/pdf":{}},"description":"PDF binary"}},"summary":"PDF report download","tags":["Export"]}},"/api/v1/activity":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.ActivityLogController.index","parameters":[{"description":"","in":"query","name":"page","required":false,"schema":{"type":"integer"}},{"description":"","in":"query","name":"per_page","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityLog"}}},"description":"Activity log"}},"summary":"Activity log","tags":["Activity"]}},"/api/v1/groups/{group_id}/members/{user_id}":{"delete":{"callbacks":{},"operationId":"SumaWeb.API.V1.GroupMemberController.remove","parameters":[{"description":"","in":"path","name":"group_id","required":true,"schema":{"type":"string"}},{"description":"","in":"path","name":"user_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{}},"description":"Removed"}},"summary":"Remove a member from group (owner only)","tags":["Group Members"]}},"/api/v1/import/json/execute":{"post":{"callbacks":{},"description":"Import data from a SUMA JSON export.","operationId":"SumaWeb.API.V1.ImportController.json_execute","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"properties":{"default_currency":{"nullable":true,"type":"string"},"json_content":{"type":"string"},"skip_duplicates":{"default":true,"type":"boolean"}},"required":["json_content"],"type":"object"}}},"description":"JSON import params","required":false},"responses":{"200":{"content":{"application/json":{}},"description":"Import result"},"400":{"content":{"application/json":{}},"description":"Error"}},"summary":"Execute JSON import","tags":["Import"]}},"/api/v1/groups/{id}":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.GroupController.show","parameters":[{"description":"","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Group"}}},"description":"Group"}},"summary":"Get a group","tags":["Groups"]},"patch":{"callbacks":{},"operationId":"SumaWeb.API.V1.GroupController.update (2)","parameters":[{"description":"","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Group"}}},"description":"Updated group"}},"summary":"Update group settings","tags":["Groups"]},"put":{"callbacks":{},"operationId":"SumaWeb.API.V1.GroupController.update","parameters":[{"description":"","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Group"}}},"description":"Updated group"}},"summary":"Update group settings","tags":["Groups"]}},"/api/v1/summary/streak":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.SummaryController.streak","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Streak"}}},"description":"Streak data"}},"summary":"Current and longest streak","tags":["Summary"]}},"/api/v1/summary/budget-scorecard":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.SummaryController.budget_scorecard","parameters":[{"description":"","in":"query","name":"year","required":false,"schema":{"type":"integer"}},{"description":"","in":"query","name":"month","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetScorecard"}}},"description":"Budget scorecard"}},"summary":"Monthly budget scorecard","tags":["Summary"]}},"/api/v1/plaid/exchange-token":{"post":{"callbacks":{},"operationId":"SumaWeb.API.V1.PlaidController.exchange_token","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExchangeTokenRequest"}}},"description":"Exchange params","required":false},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaidItem"}}},"description":"Created item"}},"summary":"Exchange a Plaid public token","tags":["Bank Connections (Plaid)"]}},"/api/v1/groups/{group_id}/transfer-ownership":{"put":{"callbacks":{},"operationId":"SumaWeb.API.V1.GroupMemberController.transfer_ownership","parameters":[{"description":"","in":"path","name":"group_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{}},"description":"Ownership transferred"}},"summary":"Transfer group ownership","tags":["Group Members"]}},"/api/v1/me":{"delete":{"callbacks":{},"operationId":"SumaWeb.API.V1.UserController.delete_me","parameters":[],"responses":{"200":{"content":{"application/json":{}},"description":"Deleted"}},"summary":"Delete account","tags":["User"]},"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.UserController.me","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}},"description":"User"}},"summary":"Get current user profile","tags":["User"]},"put":{"callbacks":{},"operationId":"SumaWeb.API.V1.UserController.update_me","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdateRequest"}}},"description":"User settings","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}},"description":"Updated user"}},"summary":"Update user settings","tags":["User"]}},"/api/v1/plaid/link-token":{"post":{"callbacks":{},"operationId":"SumaWeb.API.V1.PlaidController.create_link_token","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkToken"}}},"description":"Link token"}},"summary":"Create a Plaid Link token","tags":["Bank Connections (Plaid)"]}},"/api/v1/plaid/items":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.PlaidController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaidItem"}}},"description":"Items list"}},"summary":"List bank connections","tags":["Bank Connections (Plaid)"]}},"/api/v1/intelligence/insights":{"get":{"callbacks":{},"description":"Get precomputed financial insights (spending pace, anomalies, missed bills).","operationId":"SumaWeb.API.V1.IntelligenceController.insights","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Insights"}}},"description":"Insights"}},"summary":"Get financial insights","tags":["Intelligence"]}},"/api/v1/me/features":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.UserController.features","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Features"}}},"description":"Features"}},"summary":"Get feature toggle states","tags":["User"]},"put":{"callbacks":{},"operationId":"SumaWeb.API.V1.UserController.update_features","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Features"}}},"description":"Updated features"}},"summary":"Update feature toggles","tags":["User"]}},"/api/v1/groups/{group_id}/summary":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.GroupSubResourceController.summary","parameters":[{"description":"","in":"path","name":"group_id","required":true,"schema":{"type":"string"}},{"description":"","in":"query","name":"period","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PeriodSummary"}}},"description":"Group summary"}},"summary":"Group period summary","tags":["Groups"]}},"/api/v1/budgets/{id}":{"delete":{"callbacks":{},"operationId":"SumaWeb.API.V1.BudgetController.delete","parameters":[{"description":"Budget ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{}},"description":"Deleted"},"404":{"content":{"application/json":{}},"description":"Not found"}},"summary":"Delete a budget","tags":["Budgets"]},"patch":{"callbacks":{},"operationId":"SumaWeb.API.V1.BudgetController.update (2)","parameters":[{"description":"Budget ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Budget"}}},"description":"Updated budget"},"404":{"content":{"application/json":{}},"description":"Not found"}},"summary":"Update a budget","tags":["Budgets"]},"put":{"callbacks":{},"operationId":"SumaWeb.API.V1.BudgetController.update","parameters":[{"description":"Budget ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Budget"}}},"description":"Updated budget"},"404":{"content":{"application/json":{}},"description":"Not found"}},"summary":"Update a budget","tags":["Budgets"]}},"/api/v1/conversations/{id}":{"delete":{"callbacks":{},"operationId":"SumaWeb.API.V1.ConversationController.delete","parameters":[{"description":"Conversation ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{}},"description":"Deleted"},"404":{"content":{"application/json":{}},"description":"Not found"}},"summary":"Delete a conversation","tags":["Chat"]},"get":{"callbacks":{},"description":"Get a conversation with its full message history.","operationId":"SumaWeb.API.V1.ConversationController.show","parameters":[{"description":"Conversation ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Conversation"}}},"description":"Conversation"},"404":{"content":{"application/json":{}},"description":"Not found"}},"summary":"Get a conversation","tags":["Chat"]}},"/api/v1/groups/{group_id}/transactions":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.GroupSubResourceController.transactions","parameters":[{"description":"","in":"path","name":"group_id","required":true,"schema":{"type":"string"}},{"description":"","in":"query","name":"page","required":false,"schema":{"type":"integer"}},{"description":"","in":"query","name":"per_page","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transaction"}}},"description":"Group transactions"}},"summary":"List group transactions","tags":["Groups"]}},"/api/v1/summary":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.SummaryController.index","parameters":[{"description":"today, week_1, month_1, month_3, month_6, ytd, year_1, max","in":"query","name":"period","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PeriodSummary"}}},"description":"Summary"}},"summary":"Period summary","tags":["Summary"]}},"/api/v1/import/preview":{"post":{"callbacks":{},"description":"Upload CSV content for preview. Returns parsed rows and suggested mappings.","operationId":"SumaWeb.API.V1.ImportController.preview","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"properties":{"csv_content":{"type":"string"}},"required":["csv_content"],"type":"object"}}},"description":"CSV content","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportPreview"}}},"description":"Import preview"},"400":{"content":{"application/json":{}},"description":"Parse error"}},"summary":"Preview CSV import","tags":["Import"]}},"/api/v1/groups/join":{"post":{"callbacks":{},"operationId":"SumaWeb.API.V1.GroupController.join","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Group"}}},"description":"Joined group"}},"summary":"Join a group by invite code","tags":["Groups"]}},"/api/v1/parsing-rules":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.ParsingRuleController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParsingRule"}}},"description":"Rules"}},"summary":"List parsing rules","tags":["Parsing Rules"]},"post":{"callbacks":{},"operationId":"SumaWeb.API.V1.ParsingRuleController.create","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParsingRuleRequest"}}},"description":"Rule params","required":false},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParsingRule"}}},"description":"Created"}},"summary":"Create a parsing rule","tags":["Parsing Rules"]}},"/api/v1/groups/{group_id}/budgets":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.GroupSubResourceController.budgets","parameters":[{"description":"","in":"path","name":"group_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Budget"}}},"description":"Group budgets"}},"summary":"List group budgets","tags":["Groups"]}},"/api/v1/transactions/batch-move":{"post":{"callbacks":{},"operationId":"SumaWeb.API.V1.TransactionController.batch_move","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"properties":{"group_id":{"format":"uuid","nullable":true,"type":"string"},"ids":{"items":{"type":"string"},"type":"array"}},"required":["ids"],"type":"object"}}},"description":"Move params","required":false},"responses":{"200":{"content":{"application/json":{}},"description":"Batch result"}},"summary":"Move transactions to a group","tags":["Transactions"]}},"/api/v1/groups/{group_id}/alerts":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.GroupSubResourceController.alerts","parameters":[{"description":"","in":"path","name":"group_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Alert"}}},"description":"Group alerts"}},"summary":"List group alerts","tags":["Groups"]}},"/api/v1/categories":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.CategoryController.index","parameters":[{"description":"Filter by type (income/expense)","in":"query","name":"type","required":false,"schema":{"type":"string"}},{"description":"Only return top-level categories","in":"query","name":"top_level_only","required":false,"schema":{"type":"boolean"}},{"description":"Include children in response","in":"query","name":"include_children","required":false,"schema":{"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"description":"Categories list"}},"summary":"List categories","tags":["Categories"]},"post":{"callbacks":{},"operationId":"SumaWeb.API.V1.CategoryController.create","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}}},"description":"Category params","required":false},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"description":"Created category"},"422":{"content":{"application/json":{}},"description":"Validation error"}},"summary":"Create a category","tags":["Categories"]}},"/api/v1/summary/daily-totals":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.SummaryController.daily_totals","parameters":[{"description":"","in":"query","name":"period","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DailyTotals"}}},"description":"Daily totals"}},"summary":"Daily totals for charts","tags":["Summary"]}},"/api/v1/groups":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.GroupController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Group"}}},"description":"Groups list"}},"summary":"List user's groups","tags":["Groups"]},"post":{"callbacks":{},"operationId":"SumaWeb.API.V1.GroupController.create","parameters":[],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Group"}}},"description":"Created group"}},"summary":"Create a group","tags":["Groups"]}},"/api/v1/conversations/messages":{"post":{"callbacks":{},"description":"Send a message to the AI assistant. Creates a new conversation or continues an existing one. The response includes the assistant's reply. This is a synchronous call that may take several seconds.","operationId":"SumaWeb.API.V1.ConversationController.send_message","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendMessageRequest"}}},"description":"Message params","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendMessageResponse"}}},"description":"Assistant response"},"403":{"content":{"application/json":{}},"description":"Labs not enabled"},"422":{"content":{"application/json":{}},"description":"Validation error"}},"summary":"Send a chat message","tags":["Chat"]}},"/api/v1/budgets/{id}/status":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.BudgetController.status","parameters":[{"description":"Budget ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{}},"description":"Budget status"},"404":{"content":{"application/json":{}},"description":"Not found"}},"summary":"Get budget status","tags":["Budgets"]}},"/api/v1/groups/{group_id}/categories":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.GroupSubResourceController.categories","parameters":[{"description":"","in":"path","name":"group_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"description":"Group categories"}},"summary":"List group categories","tags":["Groups"]}},"/api/v1/feedback":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.FeedbackController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Feedback"}}},"description":"Feedback list"}},"summary":"List user's feedback","tags":["Feedback"]},"post":{"callbacks":{},"operationId":"SumaWeb.API.V1.FeedbackController.create","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}},"description":"Feedback params","required":false},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Feedback"}}},"description":"Created feedback"},"422":{"content":{"application/json":{}},"description":"Validation error"}},"summary":"Submit feedback","tags":["Feedback"]}},"/api/v1/parsing-rules/{id}":{"delete":{"callbacks":{},"operationId":"SumaWeb.API.V1.ParsingRuleController.delete","parameters":[{"description":"","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{}},"description":"Deleted"}},"summary":"Delete a parsing rule","tags":["Parsing Rules"]},"patch":{"callbacks":{},"operationId":"SumaWeb.API.V1.ParsingRuleController.update (2)","parameters":[{"description":"","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParsingRuleRequest"}}},"description":"Rule params","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParsingRule"}}},"description":"Updated"}},"summary":"Update a parsing rule","tags":["Parsing Rules"]},"put":{"callbacks":{},"operationId":"SumaWeb.API.V1.ParsingRuleController.update","parameters":[{"description":"","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParsingRuleRequest"}}},"description":"Rule params","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParsingRule"}}},"description":"Updated"}},"summary":"Update a parsing rule","tags":["Parsing Rules"]}},"/api/v1/api-keys":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.ApiKeyController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKey"}}},"description":"API keys"}},"summary":"List API keys","tags":["API Keys"]},"post":{"callbacks":{},"operationId":"SumaWeb.API.V1.ApiKeyController.create","parameters":[],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreated"}}},"description":"Created key (raw key shown once)"},"422":{"content":{"application/json":{}},"description":"Validation error"}},"summary":"Create an API key","tags":["API Keys"]}},"/api/v1/ping":{"get":{"callbacks":{},"description":"Verify your API key is valid and see basic account info.","operationId":"SumaWeb.API.V1.PingController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ping"}}},"description":"Ping response"}},"summary":"Test API connection","tags":["System"]}},"/api/v1/transactions/{id}":{"delete":{"callbacks":{},"operationId":"SumaWeb.API.V1.TransactionController.delete","parameters":[{"description":"Transaction ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{}},"description":"Deleted"},"404":{"content":{"application/json":{}},"description":"Not found"}},"summary":"Delete a transaction","tags":["Transactions"]},"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.TransactionController.show","parameters":[{"description":"Transaction ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transaction"}}},"description":"Transaction"},"404":{"content":{"application/json":{}},"description":"Not found"}},"summary":"Get a transaction","tags":["Transactions"]},"patch":{"callbacks":{},"operationId":"SumaWeb.API.V1.TransactionController.update (2)","parameters":[{"description":"Transaction ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionRequest"}}},"description":"Transaction params","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transaction"}}},"description":"Updated transaction"},"404":{"content":{"application/json":{}},"description":"Not found"},"422":{"content":{"application/json":{}},"description":"Validation error"}},"summary":"Update a transaction","tags":["Transactions"]},"put":{"callbacks":{},"operationId":"SumaWeb.API.V1.TransactionController.update","parameters":[{"description":"Transaction ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionRequest"}}},"description":"Transaction params","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transaction"}}},"description":"Updated transaction"},"404":{"content":{"application/json":{}},"description":"Not found"},"422":{"content":{"application/json":{}},"description":"Validation error"}},"summary":"Update a transaction","tags":["Transactions"]}},"/api/v1/capital":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.CapitalAssetController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapitalAsset"}}},"description":"Assets list"}},"summary":"List capital assets","tags":["Capital Assets"]},"post":{"callbacks":{},"operationId":"SumaWeb.API.V1.CapitalAssetController.create","parameters":[],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapitalAsset"}}},"description":"Created"}},"summary":"Create a capital asset","tags":["Capital Assets"]}},"/api/v1/summary/by-category":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.SummaryController.by_category","parameters":[{"description":"","in":"query","name":"period","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryBreakdown"}}},"description":"Category breakdown"}},"summary":"Category breakdown","tags":["Summary"]}},"/api/v1/conversations":{"get":{"callbacks":{},"description":"List the user's chat conversations. Requires labs_enabled.","operationId":"SumaWeb.API.V1.ConversationController.index","parameters":[{"description":"Page number","in":"query","name":"page","required":false,"schema":{"type":"integer"}},{"description":"Items per page (max 100)","in":"query","name":"per_page","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationListItem"}}},"description":"Conversations"},"403":{"content":{"application/json":{}},"description":"Labs not enabled"}},"summary":"List conversations","tags":["Chat"]}},"/api/v1/intelligence/spending-patterns":{"get":{"callbacks":{},"description":"Flag categories with spending significantly different from 3-month average.","operationId":"SumaWeb.API.V1.IntelligenceController.spending_patterns","parameters":[{"description":"Minimum % change to flag (default 30)","in":"query","name":"threshold","required":false,"schema":{"type":"number"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpendingPatterns"}}},"description":"Spending patterns"}},"summary":"Detect spending patterns","tags":["Intelligence"]}},"/api/v1/transactions/batch-delete":{"post":{"callbacks":{},"operationId":"SumaWeb.API.V1.TransactionController.batch_delete","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"properties":{"ids":{"items":{"type":"string"},"type":"array"}},"required":["ids"],"type":"object"}}},"description":"IDs","required":false},"responses":{"200":{"content":{"application/json":{}},"description":"Batch result"}},"summary":"Delete multiple transactions","tags":["Transactions"]}},"/api/v1/intelligence/spending-projection":{"get":{"callbacks":{},"description":"Project total spending for the current month based on daily rate.","operationId":"SumaWeb.API.V1.IntelligenceController.spending_projection","parameters":[{"description":"Optional category name filter","in":"query","name":"category","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpendingProjection"}}},"description":"Spending projection"}},"summary":"Project month-end spending","tags":["Intelligence"]}},"/api/v1/plaid/items/{id}/sync":{"post":{"callbacks":{},"operationId":"SumaWeb.API.V1.PlaidController.sync","parameters":[{"description":"Item ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{}},"description":"Sync triggered"}},"summary":"Trigger a manual sync","tags":["Bank Connections (Plaid)"]}},"/api/v1/groups/{group_id}/members":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.GroupMemberController.index","parameters":[{"description":"","in":"path","name":"group_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupMember"}}},"description":"Members list"}},"summary":"List group members","tags":["Group Members"]}},"/api/v1/intelligence/budget-recommendation":{"get":{"callbacks":{},"description":"Recommend a realistic budget for a category based on historical spending.","operationId":"SumaWeb.API.V1.IntelligenceController.budget_recommendation","parameters":[{"description":"Category name","in":"query","name":"category","required":true,"schema":{"type":"string"}},{"description":"Months of history (default 3, max 12)","in":"query","name":"months","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetRecommendation"}}},"description":"Budget recommendation"},"400":{"content":{"application/json":{}},"description":"Insufficient data"}},"summary":"Recommend a budget amount","tags":["Intelligence"]}},"/api/v1/plaid/items/{id}":{"delete":{"callbacks":{},"operationId":"SumaWeb.API.V1.PlaidController.delete","parameters":[{"description":"Item ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{}},"description":"Deleted"}},"summary":"Disconnect a bank","tags":["Bank Connections (Plaid)"]}},"/api/v1/recurring":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.RecurringEntryController.index","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringEntry"}}},"description":"Entries"}},"summary":"List recurring entries","tags":["Recurring Entries"]},"post":{"callbacks":{},"operationId":"SumaWeb.API.V1.RecurringEntryController.create","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringEntryRequest"}}},"description":"Entry params","required":false},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringEntry"}}},"description":"Created"}},"summary":"Create a recurring entry","tags":["Recurring Entries"]}},"/api/v1/alerts/{id}":{"delete":{"callbacks":{},"operationId":"SumaWeb.API.V1.AlertController.delete","parameters":[{"description":"Alert ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{}},"description":"Deleted"},"404":{"content":{"application/json":{}},"description":"Not found"}},"summary":"Delete an alert","tags":["Alerts"]}},"/api/v1/recurring/{id}":{"delete":{"callbacks":{},"operationId":"SumaWeb.API.V1.RecurringEntryController.delete","parameters":[{"description":"","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{}},"description":"Deleted"}},"summary":"Delete a recurring entry","tags":["Recurring Entries"]},"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.RecurringEntryController.show","parameters":[{"description":"","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringEntry"}}},"description":"Entry"}},"summary":"Get a recurring entry","tags":["Recurring Entries"]},"patch":{"callbacks":{},"operationId":"SumaWeb.API.V1.RecurringEntryController.update (2)","parameters":[{"description":"","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringEntryRequest"}}},"description":"Entry params","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringEntry"}}},"description":"Updated"}},"summary":"Update a recurring entry","tags":["Recurring Entries"]},"put":{"callbacks":{},"operationId":"SumaWeb.API.V1.RecurringEntryController.update","parameters":[{"description":"","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringEntryRequest"}}},"description":"Entry params","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecurringEntry"}}},"description":"Updated"}},"summary":"Update a recurring entry","tags":["Recurring Entries"]}},"/api/v1/plaid/transactions/{id}/skip":{"post":{"callbacks":{},"operationId":"SumaWeb.API.V1.PlaidController.skip_transaction","parameters":[{"description":"Raw transaction ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{}},"description":"Skipped"}},"summary":"Skip a pending transaction","tags":["Bank Connections (Plaid)"]}},"/api/v1/capital/{id}":{"delete":{"callbacks":{},"operationId":"SumaWeb.API.V1.CapitalAssetController.delete","parameters":[{"description":"","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{}},"description":"Deleted"}},"summary":"Delete a capital asset","tags":["Capital Assets"]},"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.CapitalAssetController.show","parameters":[{"description":"","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapitalAsset"}}},"description":"Asset"},"404":{"content":{"application/json":{}},"description":"Not found"}},"summary":"Get a capital asset","tags":["Capital Assets"]},"patch":{"callbacks":{},"operationId":"SumaWeb.API.V1.CapitalAssetController.update (2)","parameters":[{"description":"","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapitalAsset"}}},"description":"Updated"}},"summary":"Update a capital asset","tags":["Capital Assets"]},"put":{"callbacks":{},"operationId":"SumaWeb.API.V1.CapitalAssetController.update","parameters":[{"description":"","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapitalAsset"}}},"description":"Updated"}},"summary":"Update a capital asset","tags":["Capital Assets"]}},"/api/v1/intelligence/bill-history":{"get":{"callbacks":{},"description":"Check recurring bills against actual payments. Flags missed bills.","operationId":"SumaWeb.API.V1.IntelligenceController.bill_history","parameters":[{"description":"Months back to check (default 3, max 12)","in":"query","name":"months","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillHistory"}}},"description":"Bill history"}},"summary":"Check bill payment history","tags":["Intelligence"]}},"/api/v1/categories/{id}":{"delete":{"callbacks":{},"operationId":"SumaWeb.API.V1.CategoryController.delete","parameters":[{"description":"Category ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{}},"description":"Deleted"},"404":{"content":{"application/json":{}},"description":"Not found"}},"summary":"Delete a category","tags":["Categories"]},"patch":{"callbacks":{},"operationId":"SumaWeb.API.V1.CategoryController.update (2)","parameters":[{"description":"Category ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}}},"description":"Category params","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"description":"Updated category"},"404":{"content":{"application/json":{}},"description":"Not found"}},"summary":"Update a category","tags":["Categories"]},"put":{"callbacks":{},"operationId":"SumaWeb.API.V1.CategoryController.update","parameters":[{"description":"Category ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryRequest"}}},"description":"Category params","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}},"description":"Updated category"},"404":{"content":{"application/json":{}},"description":"Not found"}},"summary":"Update a category","tags":["Categories"]}},"/api/v1/api-keys/{id}":{"delete":{"callbacks":{},"operationId":"SumaWeb.API.V1.ApiKeyController.delete","parameters":[{"description":"API key ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{}},"description":"Revoked"},"404":{"content":{"application/json":{}},"description":"Not found"}},"summary":"Revoke an API key","tags":["API Keys"]}},"/api/v1/export/json":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.ExportController.json_export","parameters":[],"responses":{"200":{"content":{"application/json":{}},"description":"JSON export"}},"summary":"Full JSON data export","tags":["Export"]}},"/api/v1/export/csv":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.ExportController.csv","parameters":[{"description":"","in":"query","name":"period","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"text/csv":{}},"description":"CSV binary"}},"summary":"CSV transaction export","tags":["Export"]}},"/api/v1/import/json/preview":{"post":{"callbacks":{},"description":"Parse a SUMA JSON export for preview. Returns entity counts.","operationId":"SumaWeb.API.V1.ImportController.json_preview","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"properties":{"json_content":{"type":"string"}},"required":["json_content"],"type":"object"}}},"description":"JSON content","required":false},"responses":{"200":{"content":{"application/json":{}},"description":"JSON import preview"},"400":{"content":{"application/json":{}},"description":"Parse error"}},"summary":"Preview JSON import","tags":["Import"]}},"/api/v1/import/execute":{"post":{"callbacks":{},"description":"Import transactions from CSV with confirmed mappings.","operationId":"SumaWeb.API.V1.ImportController.execute","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportExecuteRequest"}}},"description":"Import params","required":false},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportResult"}}},"description":"Import result"},"400":{"content":{"application/json":{}},"description":"Error"}},"summary":"Execute CSV import","tags":["Import"]}},"/api/v1/intelligence/savings-goal":{"get":{"callbacks":{},"description":"Calculate monthly savings needed to reach a target amount by a date.","operationId":"SumaWeb.API.V1.IntelligenceController.savings_goal","parameters":[{"description":"Target savings amount","in":"query","name":"target_amount","required":true,"schema":{"type":"number"}},{"description":"Target date (ISO 8601)","in":"query","name":"target_date","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavingsGoal"}}},"description":"Savings goal"}},"summary":"Calculate savings goal","tags":["Intelligence"]}},"/api/v1/groups/{group_id}/capital":{"get":{"callbacks":{},"operationId":"SumaWeb.API.V1.GroupSubResourceController.capital","parameters":[{"description":"","in":"path","name":"group_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapitalAsset"}}},"description":"Group capital assets"}},"summary":"List group capital assets","tags":["Groups"]}},"/api/v1/groups/{id}/invite":{"post":{"callbacks":{},"operationId":"SumaWeb.API.V1.GroupController.invite","parameters":[{"description":"","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"201":{"content":{"application/json":{}},"description":"Invite code"}},"summary":"Create invite code","tags":["Groups"]}},"/api/v1/alerts/{id}/toggle":{"put":{"callbacks":{},"operationId":"SumaWeb.API.V1.AlertController.toggle","parameters":[{"description":"Alert ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Alert"}}},"description":"Toggled alert"},"404":{"content":{"application/json":{}},"description":"Not found"}},"summary":"Toggle alert active/inactive","tags":["Alerts"]}}},"security":[{"bearer":[]}],"servers":[{"url":"https://sumabot.online","variables":{}}],"tags":[]}