{"openapi":"3.0.3","info":{"title":"FairSlice API","description":"Expense splitting API — better than Splitwise. Supports web and mobile clients.","version":"1.0.0","contact":{"name":"FairSlice","url":"https://fairslice.app"}},"servers":[{"url":"/api","description":"Relative API base"}],"tags":[{"name":"Auth","description":"Authentication & account management"},{"name":"Groups","description":"Group CRUD and membership"},{"name":"Expenses","description":"Expense creation, splitting, and management"},{"name":"Settlements","description":"Settling debts between users"},{"name":"Friends","description":"Friend management and friend expenses"},{"name":"Notifications","description":"In-app notifications and preferences"},{"name":"Templates","description":"Expense templates for quick entry"},{"name":"Receipts","description":"Receipt scanning and OCR"},{"name":"Analytics","description":"Insights, reports, and leaderboards"},{"name":"Utility","description":"Search, export, categories, currencies"},{"name":"System","description":"Health check, realtime, webhooks"}],"paths":{"/auth/login":{"post":{"tags":["Auth"],"summary":"Login with email/password","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","minLength":6}}}}}},"responses":{"200":{"description":"Session + profile"},"401":{"description":"Invalid credentials"}}}},"/auth/signup":{"post":{"tags":["Auth"],"summary":"Register new account","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["email","password","name"],"properties":{"email":{"type":"string"},"password":{"type":"string"},"name":{"type":"string"}}}}}},"responses":{"201":{"description":"Account created"},"400":{"description":"Validation error"}}}},"/auth/refresh":{"post":{"tags":["Auth"],"summary":"Refresh access token","responses":{"200":{"description":"New tokens"}}}},"/auth/forgot-password":{"post":{"tags":["Auth"],"summary":"Send password reset email","responses":{"200":{"description":"Reset email sent"}}}},"/auth/change-password":{"post":{"tags":["Auth"],"summary":"Change password (authenticated)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Password changed"}}}},"/auth/google":{"post":{"tags":["Auth"],"summary":"Google OAuth (mobile)","responses":{"200":{"description":"Session + profile"}}}},"/auth/logout":{"post":{"tags":["Auth"],"summary":"Logout","responses":{"200":{"description":"Logged out"}}}},"/profile":{"get":{"tags":["Auth"],"summary":"Get current user profile","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"User profile (name, email, avatar, phone, currency, timezone, language)"}}},"patch":{"tags":["Auth"],"summary":"Update profile (name, avatar_url, phone, default_currency, timezone, language)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Updated profile"}}}},"/groups":{"get":{"tags":["Groups"],"summary":"List user's groups","security":[{"bearerAuth":[]}],"parameters":[{"name":"include_archived","in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"List of groups"}}},"post":{"tags":["Groups"],"summary":"Create a group","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Group created"}}}},"/groups/{id}":{"get":{"tags":["Groups"],"summary":"Get group details","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Group with members"}}},"patch":{"tags":["Groups"],"summary":"Update group","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Updated group"}}},"delete":{"tags":["Groups"],"summary":"Soft-delete group","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Group deleted"}}}},"/groups/{id}/members":{"get":{"tags":["Groups"],"summary":"List group members","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Members list"}}},"post":{"tags":["Groups"],"summary":"Add member by email","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Member added"}}}},"/groups/{id}/expenses":{"get":{"tags":["Expenses"],"summary":"List expenses (paginated)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Expenses with pagination"}}},"post":{"tags":["Expenses"],"summary":"Create expense with splits","description":"Supports: equal, unequal, percentage, shares, itemized. Auto-categorizes. Checks group approval settings.","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Expense created"}}}},"/groups/{id}/expenses/{expenseId}":{"patch":{"tags":["Expenses"],"summary":"Update expense","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Updated"}}},"delete":{"tags":["Expenses"],"summary":"Soft-delete expense","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Deleted"}}}},"/groups/{id}/expenses/{expenseId}/items":{"get":{"tags":["Expenses"],"summary":"Get itemized breakdown","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Items with assignments"}}},"post":{"tags":["Expenses"],"summary":"Set itemized splits (restaurant bill)","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Items + splits calculated"}}}},"/groups/{id}/expenses/{expenseId}/payers":{"get":{"tags":["Expenses"],"summary":"Get who paid (multi-payer)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Payers list"}}},"post":{"tags":["Expenses"],"summary":"Set multiple payers","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Payers set"}}}},"/groups/{id}/expenses/{expenseId}/comments":{"get":{"tags":["Expenses"],"summary":"List comments","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Comments"}}},"post":{"tags":["Expenses"],"summary":"Add comment","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Comment added"}}}},"/groups/{id}/expenses/{expenseId}/reactions":{"get":{"tags":["Expenses"],"summary":"Get reactions (grouped by emoji)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Reactions"}}},"post":{"tags":["Expenses"],"summary":"Add emoji reaction","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Reaction added"}}},"delete":{"tags":["Expenses"],"summary":"Remove reaction","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Removed"}}}},"/groups/{id}/expenses/{expenseId}/tags":{"get":{"tags":["Expenses"],"summary":"Get tags","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Tags"}}},"post":{"tags":["Expenses"],"summary":"Add tags","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Tags added"}}},"delete":{"tags":["Expenses"],"summary":"Remove tag","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Removed"}}}},"/groups/{id}/expenses/{expenseId}/disputes":{"get":{"tags":["Expenses"],"summary":"List disputes","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Disputes"}}},"post":{"tags":["Expenses"],"summary":"Raise a dispute","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Dispute raised"}}},"patch":{"tags":["Expenses"],"summary":"Resolve dispute","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Resolved"}}}},"/groups/{id}/expenses/{expenseId}/links":{"get":{"tags":["Expenses"],"summary":"Get linked expenses","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Links"}}},"post":{"tags":["Expenses"],"summary":"Link two expenses","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Linked"}}}},"/groups/{id}/expenses/{expenseId}/audit":{"get":{"tags":["Expenses"],"summary":"Full change history (audit trail)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Audit log"}}}},"/groups/{id}/expenses/{expenseId}/approve":{"post":{"tags":["Expenses"],"summary":"Approve or reject pending expense (admin only)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Approved/rejected"}}}},"/groups/{id}/expenses/recurring":{"get":{"tags":["Expenses"],"summary":"List recurring expenses","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Recurring list"}}},"post":{"tags":["Expenses"],"summary":"Create recurring expense","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Created"}}},"delete":{"tags":["Expenses"],"summary":"Deactivate recurring expense","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Deactivated"}}}},"/groups/{id}/expenses/check-duplicate":{"get":{"tags":["Expenses"],"summary":"Check for duplicate expenses before creating","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Duplicate check result"}}}},"/groups/{id}/pending":{"get":{"tags":["Expenses"],"summary":"List expenses pending approval","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Pending expenses"}}}},"/groups/{id}/settlements":{"get":{"tags":["Settlements"],"summary":"List settlements","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Settlements (includes status field)"}}},"post":{"tags":["Settlements"],"summary":"Record settlement (status: pending_confirmation, receiver notified)","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Settlement created with pending_confirmation status"}}}},"/groups/{id}/settlements/{settlementId}/confirm":{"patch":{"tags":["Settlements"],"summary":"Confirm a pending settlement (receiver only)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Settlement confirmed"},"403":{"description":"Not the receiver"}}}},"/groups/{id}/settlements/{settlementId}/reject":{"patch":{"tags":["Settlements"],"summary":"Reject a pending settlement (receiver only, optional reason in body)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Settlement rejected"},"403":{"description":"Not the receiver"}}}},"/groups/{id}/settle-all":{"post":{"tags":["Settlements"],"summary":"Batch settle all your debts in group (pending_confirmation)","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"All settled (pending confirmation)"}}}},"/groups/{id}/balances":{"get":{"tags":["Analytics"],"summary":"Get simplified debts (who owes who)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Balances"}}}},"/groups/{id}/simplify":{"get":{"tags":["Analytics"],"summary":"Minimum settlement plan","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Settlement plan"}}}},"/groups/{id}/debts":{"get":{"tags":["Analytics"],"summary":"Aged debts with urgency scoring","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Aged debts"}}}},"/groups/{id}/insights":{"get":{"tags":["Analytics"],"summary":"Group analytics (fairness score, trends, contributions)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Insights"}}}},"/groups/{id}/leaderboard":{"get":{"tags":["Analytics"],"summary":"Fun stats & awards","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Leaderboard"}}}},"/groups/{id}/balance-history":{"get":{"tags":["Analytics"],"summary":"Balance trend over time","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Balance history"}}}},"/groups/{id}/budgets":{"get":{"tags":["Analytics"],"summary":"Get budgets with live spending","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Budgets"}}},"post":{"tags":["Analytics"],"summary":"Create/update budget","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Budget set"}}}},"/groups/{id}/suggest":{"get":{"tags":["Expenses"],"summary":"Smart split suggestions (learns from history)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Suggestions"}}}},"/groups/{id}/activity":{"get":{"tags":["Groups"],"summary":"Group activity feed","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Activities"}}}},"/groups/{id}/notes":{"get":{"tags":["Groups"],"summary":"List group notes (pinned first)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Notes"}}},"post":{"tags":["Groups"],"summary":"Create note","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Note created"}}}},"/groups/{id}/invite":{"get":{"tags":["Groups"],"summary":"Get active invite link","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Invite"}}},"post":{"tags":["Groups"],"summary":"Generate invite link (admin only)","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Invite created"}}}},"/groups/{id}/receipts":{"get":{"tags":["Groups"],"summary":"Receipt photo gallery","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Receipts"}}}},"/groups/{id}/archive":{"post":{"tags":["Groups"],"summary":"Archive/unarchive group","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Archived"}}}},"/friends":{"get":{"tags":["Friends"],"summary":"List friends + pending requests","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Friends"}}},"post":{"tags":["Friends"],"summary":"Send friend request","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Request sent"}}}},"/friends/{id}":{"patch":{"tags":["Friends"],"summary":"Accept/decline friend request","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Updated"}}},"delete":{"tags":["Friends"],"summary":"Remove friend","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Removed"}}}},"/friends/{id}/expenses":{"get":{"tags":["Friends"],"summary":"List expenses with friend","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Expenses"}}},"post":{"tags":["Friends"],"summary":"Add expense with friend","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Created"}}}},"/friends/{id}/settlements":{"get":{"tags":["Friends"],"summary":"List settlements with friend","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Settlements (includes status field)"}}},"post":{"tags":["Friends"],"summary":"Settle up with friend (status: pending_confirmation, receiver notified)","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Settlement created with pending_confirmation status"}}}},"/friends/{id}/settlements/{settlementId}/confirm":{"patch":{"tags":["Friends"],"summary":"Confirm a pending friend settlement (receiver only)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Settlement confirmed"},"403":{"description":"Not the receiver"}}}},"/friends/{id}/settlements/{settlementId}/reject":{"patch":{"tags":["Friends"],"summary":"Reject a pending friend settlement (receiver only, optional reason in body)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Settlement rejected"},"403":{"description":"Not the receiver"}}}},"/friends/{id}/balances":{"get":{"tags":["Friends"],"summary":"Balance with friend","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Balance"}}}},"/friends/{id}/simplify":{"get":{"tags":["Friends"],"summary":"Net balance summary with friend","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Simplified"}}}},"/receipts/scan":{"post":{"tags":["Receipts"],"summary":"Scan receipt photo (Claude Vision OCR)","description":"Upload image or pass URL. Returns structured items, amounts, tax, tip. Rate limited: 10/min.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Scanned receipt + expense draft"}}}},"/receipts/scan-and-split":{"post":{"tags":["Receipts"],"summary":"Scan + assign items + create expense in one call","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Expense created from receipt"}}}},"/settlements/pending":{"get":{"tags":["Settlements"],"summary":"List settlements awaiting your confirmation","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Pending settlements with payer profile info and count"}}}},"/notifications":{"get":{"tags":["Notifications"],"summary":"List notifications (filterable)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Notifications"}}},"patch":{"tags":["Notifications"],"summary":"Mark all as read","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Marked"}}}},"/notifications/{id}":{"patch":{"tags":["Notifications"],"summary":"Mark one as read","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Marked"}}},"delete":{"tags":["Notifications"],"summary":"Delete notification","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Deleted"}}}},"/notifications/preferences":{"get":{"tags":["Notifications"],"summary":"Get notification preferences","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Preferences"}}},"put":{"tags":["Notifications"],"summary":"Update notification preferences","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Updated"}}}},"/templates":{"get":{"tags":["Templates"],"summary":"List expense templates","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Templates"}}},"post":{"tags":["Templates"],"summary":"Create template","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Created"}}}},"/templates/{id}/use":{"post":{"tags":["Templates"],"summary":"Create expense from template (one-tap)","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Expense created"}}}},"/search":{"get":{"tags":["Utility"],"summary":"Full-text search (expenses, groups, friends, tags)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Results"}}}},"/export":{"get":{"tags":["Utility"],"summary":"Export expenses as CSV","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"CSV file"}}}},"/import":{"post":{"tags":["Utility"],"summary":"Batch import from CSV","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Import results"}}}},"/categories":{"get":{"tags":["Utility"],"summary":"List expense categories","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Categories"}}}},"/currencies":{"get":{"tags":["Utility"],"summary":"List supported currencies","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Currencies"}}}},"/convert":{"get":{"tags":["Utility"],"summary":"Currency conversion (live rates)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Converted amount"}}}},"/categorize":{"get":{"tags":["Utility"],"summary":"Auto-categorize by description","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Category + confidence"}}}},"/reminders":{"post":{"tags":["Utility"],"summary":"Send payment reminder","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Reminder sent"}}}},"/reports":{"get":{"tags":["Analytics"],"summary":"Spending reports (monthly/yearly)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Report"}}}},"/activity":{"get":{"tags":["Analytics"],"summary":"Global activity feed","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Activities"}}}},"/dashboard":{"get":{"tags":["Analytics"],"summary":"Balance summary across all groups/friends","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Dashboard"}}}},"/simplify-global":{"get":{"tags":["Analytics"],"summary":"Cross-group global debt simplification","description":"Aggregates the user's net balance with every person across ALL groups and friend relationships, then simplifies to minimum transactions. Returns simplified debts with per-source breakdown showing which groups/friends contribute to each debt.","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Simplified global debts with breakdown","content":{"application/json":{"schema":{"type":"object","properties":{"global_debts":{"type":"array","items":{"type":"object","properties":{"from":{"type":"object","properties":{"user_id":{"type":"string"},"name":{"type":"string"},"avatar_url":{"type":"string","nullable":true}}},"to":{"type":"object","properties":{"user_id":{"type":"string"},"name":{"type":"string"},"avatar_url":{"type":"string","nullable":true}}},"amount":{"type":"number"},"breakdown":{"type":"array","items":{"type":"object","properties":{"source_type":{"type":"string","enum":["group","friend"]},"source_id":{"type":"string"},"source_name":{"type":"string","nullable":true},"amount":{"type":"number"}}}}}}},"total_transactions":{"type":"integer"},"savings":{"type":"object","properties":{"without_simplification":{"type":"integer"},"with_simplification":{"type":"integer"}}}}}}}}}}},"/alerts":{"get":{"tags":["Utility"],"summary":"List balance threshold alerts","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Alerts"}}},"post":{"tags":["Utility"],"summary":"Create balance alert","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Alert created"}}}},"/health":{"get":{"tags":["System"],"summary":"Health check (no auth)","responses":{"200":{"description":"Healthy"},"503":{"description":"Degraded"}}}},"/cron/recurring":{"get":{"tags":["System"],"summary":"Process due recurring expenses (cron job)","description":"Secured with CRON_SECRET Bearer token. Creates expenses for all active recurring expenses where next_due <= today. Runs daily at 6 AM UTC via Vercel Cron.","security":[{"cronAuth":[]}],"responses":{"200":{"description":"Summary of processed recurring expenses","content":{"application/json":{"schema":{"type":"object","properties":{"processed":{"type":"integer"},"created":{"type":"integer"},"errors":{"type":"array","items":{"type":"string"}}}}}}},"401":{"description":"Missing or invalid CRON_SECRET"}}}},"/cron/reminders":{"get":{"tags":["System"],"summary":"Smart reminder escalation (cron job)","description":"Secured with CRON_SECRET Bearer token. Runs daily at 2 PM UTC. Checks all outstanding debts across groups and friends, escalates reminders through tiers (gentle → direct → urgent → final) with configurable wait periods. Respects notification preferences. Skips debts under $1 and debts younger than 7 days.","security":[{"cronAuth":[]}],"responses":{"200":{"description":"Summary of reminders sent","content":{"application/json":{"schema":{"type":"object","properties":{"total_debts":{"type":"integer"},"sent":{"type":"integer"},"skipped":{"type":"integer"},"errors":{"type":"array","items":{"type":"string"}}}}}}},"401":{"description":"Missing or invalid CRON_SECRET"}}}},"/upload":{"post":{"tags":["System"],"summary":"Upload file (receipt/avatar)","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"File URL"}}}},"/devices":{"get":{"tags":["System"],"summary":"List registered devices","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Devices"}}},"post":{"tags":["System"],"summary":"Register push token","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Registered"}}}},"/webhooks":{"get":{"tags":["System"],"summary":"List webhooks","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Webhooks"}}},"post":{"tags":["System"],"summary":"Register webhook (returns signing secret)","security":[{"bearerAuth":[]}],"responses":{"201":{"description":"Webhook + secret"}}}},"/realtime/subscribe":{"get":{"tags":["System"],"summary":"Get Realtime subscription config","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Subscription channels"}}}},"/account/export":{"get":{"tags":["System"],"summary":"GDPR full data export (JSON)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Complete user data"}}}},"/account/delete":{"post":{"tags":["System"],"summary":"Delete account permanently","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Account deleted"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Supabase access_token from /auth/login or /auth/signup"}}}}