{"openapi":"3.0.0","paths":{"/api/v1/features":{"get":{"operationId":"FeatureFlagController_getFeatures","parameters":[],"responses":{"200":{"description":"Feature flags"}},"summary":"Get enabled feature flags (public-safe subset)","tags":["Features"]}},"/api/v1/auth/microsoft":{"get":{"operationId":"AuthController_microsoftAuth","parameters":[{"name":"redirect","required":false,"in":"query","description":"Admin redirect URL after auth","schema":{}},{"name":"admin","required":false,"in":"query","description":"Admin dashboard login flow","schema":{}},{"name":"src","required":false,"in":"query","description":"Referral source tracking: link | email | social (PRD Part 16 §7)","schema":{}},{"name":"ref","required":false,"in":"query","description":"Referral code from signup link (PRD Part 2 §3)","schema":{}},{"name":"protocol","required":false,"in":"query","description":"Desktop protocol override (e.g. streamli9-dev)","schema":{}}],"responses":{"302":{"description":"Redirects to Microsoft login"}},"summary":"Initiate Microsoft OAuth flow","tags":["Authentication"]}},"/api/v1/auth/microsoft/callback":{"get":{"operationId":"AuthController_microsoftCallback","parameters":[{"name":"code","required":true,"in":"query","description":"Authorization code","schema":{"type":"string"}},{"name":"state","required":true,"in":"query","description":"State parameter for CSRF protection","schema":{"type":"string"}},{"name":"error","required":true,"in":"query","schema":{"type":"string"}},{"name":"error_description","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"302":{"description":"Redirects to desktop app with tokens"}},"summary":"Microsoft OAuth callback","tags":["Authentication"]}},"/api/v1/auth/google":{"get":{"operationId":"AuthController_googleAuth","parameters":[{"name":"redirect","required":false,"in":"query","description":"Admin redirect URL after auth","schema":{}},{"name":"admin","required":false,"in":"query","description":"Admin dashboard login flow","schema":{}},{"name":"src","required":false,"in":"query","description":"Referral source tracking: link | email | social (PRD Part 16 §7)","schema":{}},{"name":"ref","required":false,"in":"query","description":"Referral code from signup link (PRD Part 2 §3)","schema":{}},{"name":"protocol","required":false,"in":"query","description":"Desktop protocol override (e.g. streamli9-dev)","schema":{}}],"responses":{"302":{"description":"Redirects to Google login"}},"summary":"Initiate Google OAuth flow","tags":["Authentication"]}},"/api/v1/auth/google/callback":{"get":{"operationId":"AuthController_googleCallback","parameters":[{"name":"code","required":true,"in":"query","description":"Authorization code","schema":{"type":"string"}},{"name":"state","required":true,"in":"query","description":"State parameter for CSRF protection","schema":{"type":"string"}},{"name":"error","required":true,"in":"query","schema":{"type":"string"}},{"name":"error_description","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"302":{"description":"Redirects to desktop app with tokens"}},"summary":"Google OAuth callback","tags":["Authentication"]}},"/api/v1/auth/zoom":{"get":{"operationId":"AuthController_zoomAuth","parameters":[{"name":"src","required":false,"in":"query","description":"Referral source tracking: link | email | social (PRD Part 16 §7)","schema":{}},{"name":"ref","required":false,"in":"query","description":"Referral code from signup link (PRD Part 2 §3)","schema":{}},{"name":"protocol","required":false,"in":"query","description":"Desktop protocol override (e.g. streamli9-dev)","schema":{}}],"responses":{"302":{"description":"Redirects to Zoom login"}},"summary":"Initiate Zoom OAuth flow","tags":["Authentication"]}},"/api/v1/auth/zoom/callback":{"get":{"operationId":"AuthController_zoomCallback","parameters":[{"name":"code","required":true,"in":"query","description":"Authorization code","schema":{"type":"string"}},{"name":"state","required":true,"in":"query","description":"State parameter for CSRF protection","schema":{"type":"string"}},{"name":"error","required":true,"in":"query","schema":{"type":"string"}},{"name":"error_description","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"302":{"description":"Redirects to desktop app with tokens"}},"summary":"Zoom OAuth callback","tags":["Authentication"]}},"/api/v1/auth/connect/{provider}":{"get":{"operationId":"AuthController_connectProviderRedirect","parameters":[{"name":"provider","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"302":{"description":"Redirects to provider login"}},"security":[{"bearer":[]}],"summary":"Connect an additional OAuth provider (redirect flow)","tags":["Authentication"]},"post":{"operationId":"AuthController_connectProvider","parameters":[{"name":"provider","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"OAuth URL for connecting provider"}},"security":[{"bearer":[]}],"summary":"Get OAuth URL to connect a provider to existing account","tags":["Authentication"]}},"/api/v1/auth/refresh":{"post":{"operationId":"AuthController_refreshToken","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenDto"}}}},"responses":{"200":{"description":"New tokens issued"},"401":{"description":"Invalid refresh token"}},"summary":"Refresh access token","tags":["Authentication"]}},"/api/v1/auth/exchange":{"post":{"operationId":"AuthController_exchangeAuthCode","parameters":[],"responses":{"200":{"description":"Tokens issued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponseDto"}}}},"401":{"description":"Invalid or expired code"}},"summary":"Exchange one-time auth code for tokens (C-5)","tags":["Authentication"]}},"/api/v1/auth/logout":{"post":{"operationId":"AuthController_logout","parameters":[],"responses":{"200":{"description":"Logged out successfully"}},"summary":"Logout user","tags":["Authentication"]}},"/api/v1/auth/me":{"get":{"operationId":"AuthController_getCurrentUser","parameters":[],"responses":{"200":{"description":"Current user info"}},"security":[{"bearer":[]}],"summary":"Get current user info","tags":["Authentication"]}},"/api/v1/auth/accounts":{"get":{"operationId":"AuthController_getConnectedAccounts","parameters":[],"responses":{"200":{"description":"List of connected accounts"}},"security":[{"bearer":[]}],"summary":"Get connected OAuth accounts","tags":["Authentication"]}},"/api/v1/auth/accounts/{provider}":{"delete":{"operationId":"AuthController_disconnectProvider","parameters":[{"name":"provider","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Provider disconnected"}},"security":[{"bearer":[]}],"summary":"Disconnect OAuth provider","tags":["Authentication"]}},"/api/v1/billing/byoai/key-status":{"get":{"operationId":"BillingController_getByoaiKeyStatus","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get the active BYOAI key failure (for the Settings banner)","tags":["Billing"]}},"/api/v1/billing/plans":{"get":{"operationId":"BillingController_getPlans","parameters":[{"name":"tier","required":false,"in":"query","schema":{"enum":["TIER_1","TIER_2"],"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List available plans","tags":["Billing"]}},"/api/v1/billing/plans/{slug}":{"get":{"operationId":"BillingController_getPlan","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get plan details","tags":["Billing"]}},"/api/v1/billing/subscription":{"get":{"operationId":"BillingController_getSubscription","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get current subscription","tags":["Billing"]}},"/api/v1/billing/checkout-session":{"post":{"operationId":"BillingController_createCheckoutSession","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Create a checkout session for subscription signup","tags":["Billing"]}},"/api/v1/billing/subscribe":{"post":{"operationId":"BillingController_subscribe","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Subscribe to a plan (trial start / internal)","tags":["Billing"]}},"/api/v1/billing/cancel":{"post":{"operationId":"BillingController_cancel","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Cancel subscription","tags":["Billing"]}},"/api/v1/billing/pause":{"post":{"operationId":"BillingController_pause","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PauseDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Pause subscription (monthly plans only, max 1 month, once per 6 months)","tags":["Billing"]}},"/api/v1/billing/resume":{"post":{"operationId":"BillingController_resume","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Resume paused subscription","tags":["Billing"]}},"/api/v1/billing/upgrade":{"post":{"operationId":"BillingController_upgrade","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Upgrade or downgrade plan","tags":["Billing"]}},"/api/v1/billing/billing-cycle":{"post":{"operationId":"BillingController_changeBillingCycle","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeBillingCycleDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Change billing cycle (monthly → annual with pro-rata credit)","tags":["Billing"]}},"/api/v1/billing/topup-checkout":{"post":{"operationId":"BillingController_topupCheckout","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopUpDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Create checkout for token top-up (Starter only)","tags":["Billing"]}},"/api/v1/billing/topup":{"post":{"operationId":"BillingController_topup","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopUpDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Purchase token top-up (Starter only) — redirects to checkout","tags":["Billing"]}},"/api/v1/billing/usage":{"get":{"description":"Returns token balance and usage for the current billing period. Per PRD Part 2.","operationId":"BillingController_getUsage","parameters":[],"responses":{"200":{"description":"Token usage information"}},"security":[{"bearer":[]}],"summary":"Get token usage","tags":["Billing"]}},"/api/v1/billing/invoices":{"get":{"operationId":"BillingController_getInvoices","parameters":[{"name":"page","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List invoices","tags":["Billing"]}},"/api/v1/billing/invoices/{id}":{"get":{"operationId":"BillingController_getInvoice","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get invoice details","tags":["Billing"]}},"/api/v1/billing/history":{"get":{"operationId":"BillingController_getHistory","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get billing history","tags":["Billing"]}},"/api/v1/billing/refund-estimate":{"get":{"operationId":"BillingController_getRefundEstimate","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Calculate potential refund amount","tags":["Billing"]}},"/api/v1/billing/region":{"get":{"operationId":"BillingController_getRegion","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get detected pricing region","tags":["Billing"]}},"/api/v1/billing/byoai/checkout-ready":{"get":{"operationId":"BillingController_checkByoaiCheckoutReady","parameters":[],"responses":{"200":{"description":"BYOAI checkout readiness status"}},"security":[{"bearer":[]}],"summary":"Check if BYOAI user has valid API keys for checkout","tags":["Billing"]}},"/api/v1/billing/byoai/key":{"post":{"operationId":"BillingController_storeByoaiKey","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ByoaiKeyDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Store BYOAI API key","tags":["Billing"]},"get":{"operationId":"BillingController_getByoaiKey","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get BYOAI key info (masked)","tags":["Billing"]},"delete":{"operationId":"BillingController_deleteByoaiKey","parameters":[{"name":"provider","required":true,"in":"query","schema":{"enum":["openai","anthropic"],"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Remove BYOAI API key","tags":["Billing"]}},"/api/v1/billing/byoai/validate":{"post":{"operationId":"BillingController_validateByoaiKey","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ByoaiKeyDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Validate a BYOAI API key","tags":["Billing"]}},"/api/v1/enterprise/organizations":{"post":{"operationId":"EnterpriseController_createOrganization","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrgDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Create an organization","tags":["Enterprise"]}},"/api/v1/enterprise/organizations/{id}":{"get":{"operationId":"EnterpriseController_getOrganization","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get organization details","tags":["Enterprise"]}},"/api/v1/enterprise/organizations/{id}/members":{"post":{"operationId":"EnterpriseController_addMember","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddMemberDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Add a member to organization","tags":["Enterprise"]}},"/api/v1/enterprise/organizations/{id}/members/{userId}":{"delete":{"operationId":"EnterpriseController_removeMember","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Remove a member from organization","tags":["Enterprise"]}},"/api/v1/enterprise/organizations/{id}/seats":{"put":{"operationId":"EnterpriseController_updateSeats","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSeatsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Update seat count","tags":["Enterprise"]}},"/api/v1/enterprise/organizations/{id}/usage":{"get":{"operationId":"EnterpriseController_getOrgUsage","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get organization usage analytics","tags":["Enterprise"]}},"/api/v1/enterprise/organizations/{id}/billing":{"get":{"operationId":"EnterpriseController_getOrgBilling","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get organization billing summary","tags":["Enterprise"]}},"/api/v1/notifications":{"get":{"operationId":"NotificationController_list","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"unreadOnly","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Notification"]}},"/api/v1/notifications/unread-count":{"get":{"operationId":"NotificationController_unreadCount","parameters":[],"responses":{"200":{"description":""}},"tags":["Notification"]}},"/api/v1/notifications/{id}/read":{"patch":{"operationId":"NotificationController_markAsRead","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Notification"]}},"/api/v1/notifications/read-all":{"patch":{"operationId":"NotificationController_markAllAsRead","parameters":[],"responses":{"200":{"description":""}},"tags":["Notification"]}},"/api/v1/users/me":{"get":{"operationId":"UsersController_getProfile","parameters":[],"responses":{"200":{"description":"Returns user profile with related data"},"404":{"description":"User not found"}},"security":[{"bearer":[]}],"summary":"Get current user profile with settings and subscription","tags":["Users"]},"patch":{"operationId":"UsersController_updateProfile","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileDto"}}}},"responses":{"200":{"description":"Profile updated successfully"},"404":{"description":"User not found"}},"security":[{"bearer":[]}],"summary":"Update current user profile (name, timezone)","tags":["Users"]},"delete":{"description":"Schedules account for deletion with 30-day grace period. Per PRD Part 12 §2.4.","operationId":"UsersController_requestDeletion","parameters":[],"responses":{"200":{"description":"Deletion scheduled successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestDeletionResponseDto"}}}},"400":{"description":"Deletion already scheduled"}},"security":[{"bearer":[]}],"summary":"Request account deletion","tags":["Users"]}},"/api/v1/users/me/settings":{"get":{"operationId":"UsersController_getSettings","parameters":[],"responses":{"200":{"description":"Returns user settings"}},"security":[{"bearer":[]}],"summary":"Get user notification and display settings","tags":["Users"]},"patch":{"operationId":"UsersController_updateSettings","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSettingsDto"}}}},"responses":{"200":{"description":"Settings updated successfully"},"404":{"description":"User not found"}},"security":[{"bearer":[]}],"summary":"Update user settings (partial update)","tags":["Users"]}},"/api/v1/users/me/select-plan":{"post":{"operationId":"UsersController_selectPlan","parameters":[],"responses":{"201":{"description":"Plan selected, subscription created"},"404":{"description":"User not found"}},"security":[{"bearer":[]}],"summary":"Select a plan (creates subscription for beta users)","tags":["Users"]}},"/api/v1/users/me/cancel-deletion":{"post":{"description":"Cancels a pending deletion request during the 30-day grace period. Per PRD Part 12 §2.4.","operationId":"UsersController_cancelDeletion","parameters":[],"responses":{"200":{"description":"Deletion cancelled successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelDeletionResponseDto"}}}},"400":{"description":"No pending deletion to cancel"}},"security":[{"bearer":[]}],"summary":"Cancel pending account deletion","tags":["Users"]}},"/api/v1/users/me/deletion-status":{"get":{"description":"Returns deletion status and days remaining in grace period.","operationId":"UsersController_getDeletionStatus","parameters":[],"responses":{"200":{"description":"Deletion status retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeletionStatusResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Get account deletion status","tags":["Users"]}},"/api/v1/users/me/export":{"post":{"description":"Requests a full export of user data (GDPR data portability). Per PRD Part 12 §2.3. Accessible to ACTIVE/TRIAL users and to CANCELLED users within the 90-day data retention window (per PRD Part 2 §4.4).","operationId":"UsersController_requestExport","parameters":[],"responses":{"201":{"description":"Export request created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestExportResponseDto"}}}},"400":{"description":"Export already pending"}},"security":[{"bearer":[]}],"summary":"Request data export","tags":["Users"]}},"/api/v1/users/me/exports":{"get":{"description":"Returns all export requests for the current user.","operationId":"UsersController_getExports","parameters":[],"responses":{"200":{"description":"List of exports","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportListResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"List data exports","tags":["Users"]}},"/api/v1/users/me/exports/{id}":{"get":{"description":"Returns the status of a specific export request. Includes download URL when ready.","operationId":"UsersController_getExportById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Export details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportResponseDto"}}}},"404":{"description":"Export not found"}},"security":[{"bearer":[]}],"summary":"Get export status","tags":["Users"]}},"/api/v1/users/me/exports/{id}/download":{"get":{"description":"Downloads the ZIP file for a completed export. Only available when status is READY.","operationId":"UsersController_downloadExport","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"ZIP file download"},"404":{"description":"Export not found or not ready"},"410":{"description":"Export has expired"}},"security":[{"bearer":[]}],"summary":"Download export file","tags":["Users"]}},"/api/v1/users/me/feedback":{"post":{"operationId":"UsersController_submitFeedback","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Submit feedback (bug, feature request, complaint, praise)","tags":["Users"]}},"/api/v1/users/me/nps/check":{"get":{"operationId":"UsersController_checkNps","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Check if NPS popup should be shown","tags":["Users"]}},"/api/v1/users/me/nps":{"post":{"operationId":"UsersController_submitNps","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Submit NPS score (0-10)","tags":["Users"]}},"/api/v1/users/me/churn-survey":{"post":{"operationId":"UsersController_submitChurnSurvey","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Submit churn survey during cancellation","tags":["Users"]}},"/api/v1/meetings":{"get":{"operationId":"MeetingsController_findAll","parameters":[{"name":"role","required":false,"in":"query","description":"Filter by user role in the meeting","schema":{"example":"host","type":"string","enum":["host","participant"]}},{"name":"filter","required":false,"in":"query","description":"Filter by time: upcoming or past meetings","schema":{"example":"upcoming","type":"string","enum":["upcoming","past"]}},{"name":"search","required":false,"in":"query","description":"Search by meeting title","schema":{"example":"standup","type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number (1-indexed)","schema":{"minimum":1,"default":1,"example":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"Number of items per page","schema":{"minimum":1,"maximum":100,"default":20,"example":20,"type":"number"}},{"name":"status","required":false,"in":"query","description":"Filter by meeting status","schema":{"example":"COMPLETED","type":"string","enum":["SCHEDULED","PROCESSING","COMPLETED","FAILED"]}},{"name":"platform","required":false,"in":"query","description":"Filter by platform","schema":{"example":"zoom","type":"string","enum":["zoom","teams","meet"]}},{"name":"startDate","required":false,"in":"query","description":"Filter meetings starting after this date","schema":{"example":"2026-01-01T00:00:00.000Z","type":"string"}},{"name":"endDate","required":false,"in":"query","description":"Filter meetings starting before this date","schema":{"example":"2026-12-31T23:59:59.999Z","type":"string"}},{"name":"hasTranscript","required":false,"in":"query","description":"Filter by transcript presence. true = meetings with a stored transcript; false = meetings without one (transcriptText IS NULL). Used by the Dashboard transcript-missing banner to land the user on the same set the count was calculated from.","schema":{"example":false,"type":"boolean"}},{"name":"timeBucket","required":false,"in":"query","description":"Calendar-week time bucket filter. 'today' = this calendar day; 'tomorrow' = the next calendar day; 'week' = this Sun-Sat week excluding today; 'last_week' = the prior Sun-Sat week; 'month' = this calendar month; 'last_month' = the prior calendar month; 'all' = no filter. Predicates align with the Dashboard UpcomingMeetings widget so banner counts match the filtered Meetings page exactly.","schema":{"example":"today","type":"string","enum":["today","tomorrow","week","last_week","month","last_month","all"]}}],"responses":{"200":{"description":"Returns paginated list of meetings"}},"security":[{"bearer":[]}],"summary":"List user meetings (as organizer or participant)","tags":["Meetings"]},"post":{"operationId":"MeetingsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMeetingDto"}}}},"responses":{"201":{"description":"Meeting created successfully"}},"security":[{"bearer":[]}],"summary":"Create a new meeting","tags":["Meetings"]}},"/api/v1/meetings/{id}":{"get":{"operationId":"MeetingsController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns meeting with full relations"},"403":{"description":"Not authorized to view this meeting"},"404":{"description":"Meeting not found"}},"security":[{"bearer":[]}],"summary":"Get meeting details with action items and participants","tags":["Meetings"]},"patch":{"operationId":"MeetingsController_updateSettings","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMeetingDto"}}}},"responses":{"200":{"description":"Meeting settings updated"},"403":{"description":"Only the organizer can update settings"},"404":{"description":"Meeting not found"}},"security":[{"bearer":[]}],"summary":"Update meeting progress update settings","tags":["Meetings"]}},"/api/v1/meetings/sync":{"post":{"operationId":"MeetingsController_syncMeetings","parameters":[],"responses":{"200":{"description":"Sync completed or message returned","content":{"application/json":{"schema":{"properties":{"synced":{"type":"number","description":"Number of meetings synced"},"errors":{"type":"number","description":"Number of sync errors"},"skipped":{"type":"number","description":"Number of already-synced meetings"},"message":{"type":"string","description":"Status message"}}}}}}},"security":[{"bearer":[]}],"summary":"Trigger meeting sync from connected calendars (Zoom)","tags":["Meetings"]}},"/api/v1/meetings/{id}/extract":{"post":{"operationId":"MeetingsController_extractActionItems","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Extraction queued successfully","content":{"application/json":{"schema":{"properties":{"queued":{"type":"boolean","description":"Whether extraction was queued"},"message":{"type":"string","description":"Status message"}}}}}},"400":{"description":"Meeting has no transcript"},"404":{"description":"Meeting not found"}},"security":[{"bearer":[]}],"summary":"Re-extract action items from meeting transcript","tags":["Meetings"]}},"/api/v1/meetings/{id}/refresh":{"post":{"description":"Host-only. Smart recovery action: re-fetches the transcript from the meeting platform when none is stored, re-runs extraction when content exists but no action items were produced, or is a no-op when the meeting is already complete. The caller should refetch the meeting afterward for the latest state.","operationId":"MeetingsController_refreshMeeting","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Refresh completed","content":{"application/json":{"schema":{"properties":{"action":{"type":"string","enum":["transcript_refetched","transcript_unavailable","re_extracted","up_to_date"],"description":"What the refresh did"},"transcriptFound":{"type":"boolean","description":"Whether a transcript is now present"},"message":{"type":"string","description":"Human-readable status message"}}}}}},"400":{"description":"Meeting cannot be refreshed (no platform link)"},"403":{"description":"Not the meeting organizer"},"404":{"description":"Meeting not found"}},"security":[{"bearer":[]}],"summary":"Refresh a meeting","tags":["Meetings"]}},"/api/v1/meetings/{id}/request-update":{"post":{"operationId":"MeetingsController_requestProgressUpdate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Progress update requested"},"429":{"description":"Rate limited — one request per 24 hours"}},"security":[{"bearer":[]}],"summary":"Request a team progress update (participant)","tags":["Meetings"]}},"/api/v1/meetings/{id}/email-thread":{"get":{"operationId":"MeetingsController_getEmailThread","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Returns email thread with AI-detected status updates"},"403":{"description":"Not authorized to view this meeting"},"404":{"description":"Meeting or email thread not found"}},"security":[{"bearer":[]}],"summary":"Get the email thread associated with a meeting (F-003)","tags":["Meetings"]}},"/api/v1/meetings/{id}/remind-team":{"post":{"description":"Sends a reminder email to each unique owner of open (non-completed) action items in this meeting. Only the meeting host can trigger this. Per PRD Part 6 §3.3.","operationId":"MeetingsController_remindTeam","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Reminders sent"},"403":{"description":"Not the meeting host"},"404":{"description":"Meeting not found"}},"security":[{"bearer":[]}],"summary":"Send reminders to all team members with open action items","tags":["Meetings"]}},"/api/v1/action-items":{"get":{"operationId":"ActionItemsController_findAll","parameters":[{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"pageSize","required":false,"in":"query","schema":{"type":"number"}},{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"priority","required":false,"in":"query","schema":{"type":"string"}},{"name":"extractionStatus","required":false,"in":"query","schema":{"type":"string"}},{"name":"assignee","required":false,"in":"query","description":"Filter by assignee type (PRD §8.13)","schema":{"enum":["me","team"],"type":"string"}},{"name":"due","required":false,"in":"query","description":"Filter by due date range. 'today', 'week', and 'overdue' mirror DashboardService.dueToday/dueThisWeek/overdue exactly. 'attention' applies the Dashboard NeedsAttention predicate: status=BLOCKED OR overdue OR due-today, excluding COMPLETE+CANCELLED. All keep the dashboard counts and linked filtered pages in lockstep.","schema":{"enum":["today","week","overdue","attention"],"type":"string"}},{"name":"meeting","required":false,"in":"query","description":"Filter by meeting ID (PRD §8.13)","schema":{"type":"string"}},{"name":"meeting_role","required":false,"in":"query","description":"Filter by user role in meeting (PRD §8.13)","schema":{"enum":["host","attendee"],"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List user action items","tags":["Action Items"]},"post":{"operationId":"ActionItemsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateActionItemDto"}}}},"responses":{"201":{"description":"Action item created"},"403":{"description":"Not authorized for this meeting"}},"security":[{"bearer":[]}],"summary":"Create action item","tags":["Action Items"]}},"/api/v1/action-items/pending-review":{"get":{"description":"Returns all action items with extractionStatus=PENDING_REVIEW for meetings where current user is the host. Per PRD F-002 Section 2.6.","operationId":"ActionItemsController_getPendingReviewItems","parameters":[],"responses":{"200":{"description":"List of pending review items"}},"security":[{"bearer":[]}],"summary":"Get all pending review items for current user as host","tags":["Action Items"]}},"/api/v1/action-items/{id}":{"get":{"operationId":"ActionItemsController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"403":{"description":"Not authorized to view this action item"}},"security":[{"bearer":[]}],"summary":"Get action item details","tags":["Action Items"]},"patch":{"operationId":"ActionItemsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateActionItemDto"}}}},"responses":{"200":{"description":"Action item updated"},"403":{"description":"Not authorized to update this action item"}},"security":[{"bearer":[]}],"summary":"Update action item","tags":["Action Items"]},"delete":{"operationId":"ActionItemsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Action item deleted"},"403":{"description":"Not authorized to delete this action item"}},"security":[{"bearer":[]}],"summary":"Delete action item","tags":["Action Items"]}},"/api/v1/action-items/{id}/remind":{"post":{"description":"Sends a reminder email to the action item owner via the host's connected email account. Only the meeting host can send reminders.","operationId":"ActionItemsController_sendReminder","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Reminder sent successfully"},"403":{"description":"Not the meeting host"},"404":{"description":"Action item not found"}},"security":[{"bearer":[]}],"summary":"Send reminder for action item","tags":["Action Items"]}},"/api/v1/action-items/{id}/comments":{"get":{"operationId":"ActionItemsController_getComments","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Comments list"}},"security":[{"bearer":[]}],"summary":"List comments for an action item","tags":["Action Items"]},"post":{"operationId":"ActionItemsController_addComment","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"Comment created"}},"security":[{"bearer":[]}],"summary":"Add comment to an action item","tags":["Action Items"]}},"/api/v1/action-items/{id}/status-history":{"get":{"operationId":"ActionItemsController_getStatusHistory","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Status history list"}},"security":[{"bearer":[]}],"summary":"List status history for an action item","tags":["Action Items"]}},"/api/v1/action-items/{id}/extraction-status":{"patch":{"description":"Updates the extraction status of an action item. Only the meeting host can perform this action. Per PRD F-002 Section 2.6.","operationId":"ActionItemsController_updateExtractionStatus","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateExtractionStatusDto"}}}},"responses":{"200":{"description":"Status updated successfully"},"400":{"description":"Invalid status transition"},"403":{"description":"Not the meeting host"},"404":{"description":"Action item not found"}},"security":[{"bearer":[]}],"summary":"Update extraction status for a single item","tags":["Action Items"]}},"/api/v1/action-items/{id}/request-extension":{"post":{"description":"The action item OWNER (not host) requests a new due date with a reason. Host of the meeting receives a notification and can approve / deny via the endpoints below. One PENDING request per item allowed at a time. Per PRD Part 6 US-P009.","operationId":"ActionItemsController_requestExtension","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateExtensionRequestDto"}}}},"responses":{"201":{"description":"Extension request created"},"400":{"description":"Validation error or pending request already exists"},"403":{"description":"Caller is not the owner of the item"},"404":{"description":"Action item not found"}},"security":[{"bearer":[]}],"summary":"Request a deadline extension for an action item","tags":["Action Items"]}},"/api/v1/action-items/{id}/extension-requests":{"get":{"description":"Visible to the item's owner and to the meeting's host. Returns all requests (any status) ordered newest first. Per PRD Part 6 US-P009.","operationId":"ActionItemsController_listExtensionRequests","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Extension requests for the item"},"403":{"description":"Not the owner or host"},"404":{"description":"Action item not found"}},"security":[{"bearer":[]}],"summary":"List extension requests for an action item","tags":["Action Items"]}},"/api/v1/action-items/{id}/extension/{requestId}/approve":{"post":{"description":"Only the meeting's host can approve. Approving updates the action item's dueDate, writes a DUE_DATE_CHANGE audit row (source: SYSTEM), re-evaluates AT_RISK dependencies, and notifies the requester. Per PRD Part 6 US-P009.","operationId":"ActionItemsController_approveExtension","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"requestId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RespondToExtensionRequestDto"}}}},"responses":{"200":{"description":"Request approved + due date updated"},"400":{"description":"Request is not in PENDING status"},"403":{"description":"Caller is not the meeting host"},"404":{"description":"Request not found"}},"security":[{"bearer":[]}],"summary":"Approve a pending extension request","tags":["Action Items"]}},"/api/v1/action-items/{id}/extension/{requestId}/deny":{"post":{"description":"Only the meeting's host can deny. Denying notifies the requester with the host's response. Does NOT change the action item's due date. Per PRD Part 6 US-P009.","operationId":"ActionItemsController_denyExtension","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"requestId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RespondToExtensionRequestDto"}}}},"responses":{"200":{"description":"Request denied + requester notified"},"400":{"description":"Request is not in PENDING status"},"403":{"description":"Caller is not the meeting host"},"404":{"description":"Request not found"}},"security":[{"bearer":[]}],"summary":"Deny a pending extension request","tags":["Action Items"]}},"/api/v1/meetings/{meetingId}/extraction/pending":{"get":{"description":"Returns all action items pending review for a specific meeting. Only accessible by meeting host. Per PRD F-002 Section 2.6.","operationId":"MeetingsExtractionController_getPendingForMeeting","parameters":[{"name":"meetingId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Pending items for the meeting"},"403":{"description":"Not the meeting host"},"404":{"description":"Meeting not found"}},"security":[{"bearer":[]}],"summary":"Get pending review items for a meeting","tags":["Meetings - Extraction Approval"]}},"/api/v1/meetings/{meetingId}/extraction/approve":{"post":{"description":"Approves all action items with PENDING_REVIEW status for the meeting. Only accessible by meeting host. Per PRD F-002 Section 2.6.","operationId":"MeetingsExtractionController_approveAll","parameters":[{"name":"meetingId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Items approved successfully"},"403":{"description":"Not the meeting host"},"404":{"description":"Meeting not found"}},"security":[{"bearer":[]}],"summary":"Approve all pending items for a meeting","tags":["Meetings - Extraction Approval"]}},"/api/v1/meetings/{meetingId}/extraction/reject":{"post":{"description":"Rejects all action items with PENDING_REVIEW status for the meeting. Only accessible by meeting host. Per PRD F-002 Section 2.6.","operationId":"MeetingsExtractionController_rejectAll","parameters":[{"name":"meetingId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Items rejected"},"403":{"description":"Not the meeting host"},"404":{"description":"Meeting not found"}},"security":[{"bearer":[]}],"summary":"Reject all pending items for a meeting","tags":["Meetings - Extraction Approval"]}},"/api/v1/public/action-items/{id}/public":{"get":{"operationId":"PublicActionItemsController_getPublicDetails","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"token","required":true,"in":"query","schema":{"type":"string"}},{"name":"action","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Action item details"},"400":{"description":"Missing or invalid token"},"404":{"description":"Action item not found"}},"summary":"Get action item details (public, token-verified)","tags":["Action Items - Public"]}},"/api/v1/public/action-items/{id}/public-action":{"post":{"operationId":"PublicActionItemsController_performPublicAction","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Action performed"},"400":{"description":"Invalid token or action"},"404":{"description":"Action item not found"}},"summary":"Update action item via email token (no auth)","tags":["Action Items - Public"]}},"/api/v1/dependencies/meeting/{meetingId}":{"get":{"operationId":"DependenciesController_getByMeeting","parameters":[{"name":"meetingId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Dependencies"]}},"/api/v1/dependencies/action-item/{id}":{"get":{"operationId":"DependenciesController_getByActionItem","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Dependencies"]}},"/api/v1/dependencies/user":{"get":{"operationId":"DependenciesController_getByUser","parameters":[],"responses":{"200":{"description":""}},"tags":["Dependencies"]}},"/api/v1/dependencies":{"post":{"operationId":"DependenciesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDependencyDto"}}}},"responses":{"201":{"description":""}},"tags":["Dependencies"]}},"/api/v1/dependencies/{id}":{"delete":{"operationId":"DependenciesController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Dependencies"]}},"/api/v1/dependencies/{id}/resolve":{"post":{"operationId":"DependenciesController_resolve","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Dependencies"]}},"/api/v1/dependencies/{id}/validate":{"get":{"operationId":"DependenciesController_validateBuffer","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Dependencies"]}},"/api/v1/reminders/settings":{"get":{"operationId":"RemindersController_getSettings","parameters":[],"responses":{"200":{"description":""}},"tags":["Reminders"]},"put":{"operationId":"RemindersController_updateSettings","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateReminderSettingsDto"}}}},"responses":{"200":{"description":""}},"tags":["Reminders"]}},"/api/v1/reminders":{"get":{"operationId":"RemindersController_listReminders","parameters":[],"responses":{"200":{"description":""}},"tags":["Reminders"]}},"/api/v1/reminders/meeting/{meetingId}":{"get":{"operationId":"RemindersController_getRemindersForMeeting","parameters":[{"name":"meetingId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Reminders"]}},"/api/v1/reminders/send-now":{"post":{"operationId":"RemindersController_sendReminderNow","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendReminderNowDto"}}}},"responses":{"201":{"description":""}},"tags":["Reminders"]}},"/api/v1/reminders/preview":{"post":{"operationId":"RemindersController_previewReminder","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewReminderDto"}}}},"responses":{"201":{"description":""}},"tags":["Reminders"]}},"/api/v1/reminders/{id}":{"delete":{"operationId":"RemindersController_cancelReminder","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Reminders"]}},"/api/v1/public/progress-updates/opt-out":{"get":{"operationId":"PublicProgressOptOutController_optOut","parameters":[{"name":"id","required":true,"in":"query","schema":{"type":"string"}},{"name":"type","required":true,"in":"query","schema":{"type":"string"}},{"name":"token","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["PublicProgressOptOut"]}},"/api/v1/channel-monitoring/channels":{"get":{"operationId":"ChannelMonitoringController_getChannels","parameters":[],"responses":{"200":{"description":""}},"tags":["ChannelMonitoring"]},"post":{"operationId":"ChannelMonitoringController_addChannel","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddChannelDto"}}}},"responses":{"201":{"description":""}},"tags":["ChannelMonitoring"]}},"/api/v1/channel-monitoring/channels/{id}":{"delete":{"operationId":"ChannelMonitoringController_removeChannel","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["ChannelMonitoring"]}},"/api/v1/channel-monitoring/detections":{"get":{"operationId":"ChannelMonitoringController_getDetections","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"pageSize","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["ChannelMonitoring"]}},"/api/v1/channel-monitoring/detections/{id}/undo":{"post":{"operationId":"ChannelMonitoringController_undoDetection","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["ChannelMonitoring"]}},"/api/v1/series":{"get":{"operationId":"RecurringSeriesController_findAll","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Recurring Series"]},"post":{"operationId":"RecurringSeriesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSeriesDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["Recurring Series"]}},"/api/v1/series/{id}":{"get":{"operationId":"RecurringSeriesController_findById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Recurring Series"]},"put":{"operationId":"RecurringSeriesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSeriesDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Recurring Series"]},"delete":{"operationId":"RecurringSeriesController_delete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Recurring Series"]}},"/api/v1/series/{id}/instances":{"get":{"operationId":"RecurringSeriesController_getInstances","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Recurring Series"]}},"/api/v1/series/{id}/link/{meetingId}":{"post":{"operationId":"RecurringSeriesController_linkMeeting","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"meetingId","required":true,"in":"path","schema":{"type":"string"}},{"name":"instanceNumber","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["Recurring Series"]}},"/api/v1/series/{id}/unlink/{meetingId}":{"delete":{"operationId":"RecurringSeriesController_unlinkMeeting","parameters":[{"name":"meetingId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Recurring Series"]}},"/api/v1/series/{id}/context":{"get":{"operationId":"RecurringSeriesController_getContext","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"instanceNumber","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Recurring Series"]}},"/api/v1/series/{id}/request-update":{"post":{"operationId":"RecurringSeriesController_requestProgressUpdate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["Recurring Series"]}},"/api/v1/series/detect":{"post":{"operationId":"RecurringSeriesController_detectSeries","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetectSeriesDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["Recurring Series"]}},"/api/v1/series/carry-forward":{"post":{"operationId":"RecurringSeriesController_carryForward","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CarryForwardDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["Recurring Series"]}},"/api/v1/meetings/{id}/previous-summary":{"get":{"operationId":"MeetingContextController_getPreviousSummary","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Meeting Context"]}},"/api/v1/meetings/{id}/carried-forward":{"get":{"operationId":"MeetingContextController_getCarriedForwardItems","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Meeting Context"]}},"/api/v1/distributor/enable":{"post":{"operationId":"DistributorController_enableDistributor","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnableDistributorDto"}}}},"responses":{"201":{"description":"Distributor mode enabled"},"409":{"description":"Already enrolled"}},"security":[{"bearer":[]}],"summary":"Enrol as a distributor","tags":["Distributor"]}},"/api/v1/distributor/disable":{"post":{"operationId":"DistributorController_disableDistributor","parameters":[],"responses":{"201":{"description":"Distributor mode disabled"}},"security":[{"bearer":[]}],"summary":"Disable distributor mode","tags":["Distributor"]}},"/api/v1/distributor/profile":{"get":{"operationId":"DistributorController_getProfile","parameters":[],"responses":{"200":{"description":"Distributor profile data"}},"security":[{"bearer":[]}],"summary":"Get distributor profile","tags":["Distributor"]}},"/api/v1/distributor/stats":{"get":{"operationId":"DistributorController_getStats","parameters":[],"responses":{"200":{"description":"Referral stats"}},"security":[{"bearer":[]}],"summary":"Get referral statistics","tags":["Distributor"]}},"/api/v1/distributor/earnings":{"get":{"operationId":"DistributorController_getEarnings","parameters":[],"responses":{"200":{"description":"Earnings data with commission history"}},"security":[{"bearer":[]}],"summary":"Get earnings breakdown","tags":["Distributor"]}},"/api/v1/distributor/payouts":{"get":{"operationId":"DistributorController_getPayouts","parameters":[{"name":"page","required":false,"in":"query","schema":{"type":"number"}},{"name":"pageSize","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Paginated payout history"}},"security":[{"bearer":[]}],"summary":"Get payout history","tags":["Distributor"]}},"/api/v1/distributor/payouts/request":{"post":{"operationId":"DistributorController_requestPayout","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestPayoutDto"}}}},"responses":{"201":{"description":"Payout request created"},"400":{"description":"Insufficient balance or frozen"}},"security":[{"bearer":[]}],"summary":"Request a payout (minimum $10)","tags":["Distributor"]}},"/api/v1/distributor/payment-methods":{"get":{"operationId":"DistributorController_getPaymentMethods","parameters":[],"responses":{"200":{"description":"List of payment methods"}},"security":[{"bearer":[]}],"summary":"List saved payment methods","tags":["Distributor"]},"post":{"operationId":"DistributorController_addPaymentMethod","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePaymentMethodDto"}}}},"responses":{"201":{"description":"Payment method created"}},"security":[{"bearer":[]}],"summary":"Add a new payment method","tags":["Distributor"]}},"/api/v1/distributor/payment-methods/{id}":{"patch":{"operationId":"DistributorController_updatePaymentMethod","parameters":[{"name":"id","required":true,"in":"path","description":"Payment method ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePaymentMethodDto"}}}},"responses":{"200":{"description":"Payment method updated"}},"security":[{"bearer":[]}],"summary":"Update a payment method","tags":["Distributor"]},"delete":{"operationId":"DistributorController_removePaymentMethod","parameters":[{"name":"id","required":true,"in":"path","description":"Payment method ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Payment method removed"}},"security":[{"bearer":[]}],"summary":"Remove a payment method","tags":["Distributor"]}},"/api/v1/distributor/payment-methods/{id}/default":{"post":{"operationId":"DistributorController_setDefaultPaymentMethod","parameters":[{"name":"id","required":true,"in":"path","description":"Payment method ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Default payment method updated"}},"security":[{"bearer":[]}],"summary":"Set a payment method as default","tags":["Distributor"]}},"/api/v1/distributor/payout-connect/start":{"post":{"operationId":"DistributorController_startPayoutConnect","parameters":[],"responses":{"200":{"description":"Coming soon status"}},"security":[{"bearer":[]}],"summary":"Start payout onboarding (stub)","tags":["Distributor"]}},"/api/v1/distributor/referral-link":{"get":{"operationId":"DistributorController_getReferralLink","parameters":[],"responses":{"200":{"description":"Referral link and code"}},"security":[{"bearer":[]}],"summary":"Get referral link and code","tags":["Distributor"]}},"/api/v1/distributor/referral-code":{"patch":{"description":"Sets a custom referral code. Old code is retired but keeps working. Retired codes cannot be recycled by other distributors. Per Distributor PRD §6 Step 3.","operationId":"DistributorController_requestCustomCode","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomReferralCodeDto"}}}},"responses":{"200":{"description":"Code updated successfully"},"400":{"description":"Invalid code format"},"409":{"description":"Code already taken"}},"security":[{"bearer":[]}],"summary":"Request a custom referral code","tags":["Distributor"]}},"/api/v1/distributor/review-cases":{"get":{"operationId":"DistributorController_getReviewCases","parameters":[],"responses":{"200":{"description":"List of review cases"}},"security":[{"bearer":[]}],"summary":"List review cases for current distributor","tags":["Distributor"]}},"/api/v1/distributor/account-status":{"get":{"operationId":"DistributorController_getAccountStatus","parameters":[],"responses":{"200":{"description":"Account status info"}},"security":[{"bearer":[]}],"summary":"Get account health / risk status","tags":["Distributor"]}},"/api/v1/distributor/review-cases/appeal":{"post":{"operationId":"DistributorController_submitAppeal","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitAppealDto"}}}},"responses":{"201":{"description":"Appeal submitted"},"400":{"description":"Invalid appeal"}},"security":[{"bearer":[]}],"summary":"Submit an appeal for a review case","tags":["Distributor"]}},"/api/v1/distributor/ref/{code}":{"get":{"operationId":"DistributorController_trackClick","parameters":[{"name":"code","required":true,"in":"path","description":"Distributor referral code","schema":{"type":"string"}}],"responses":{"200":{"description":"Redirect URL"}},"summary":"Track referral click and redirect to signup","tags":["Distributor"]}},"/api/v1/distributor/ref/attribute":{"post":{"operationId":"DistributorController_attributeReferral","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttributeReferralDto"}}}},"responses":{"201":{"description":"Referral attributed"},"404":{"description":"No valid referral found"}},"summary":"Attribute a signup to a referral code","tags":["Distributor"]}},"/api/v1/referral/link":{"get":{"operationId":"ReferralController_getReferralLink","parameters":[],"responses":{"200":{"description":""}},"tags":["Referral"]}},"/api/v1/referral/stats":{"get":{"operationId":"ReferralController_getReferralStats","parameters":[],"responses":{"200":{"description":""}},"tags":["Referral"]}},"/api/v1/personal-items":{"get":{"operationId":"PersonalItemsController_list","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"pageSize","required":true,"in":"query","schema":{"type":"string"}},{"name":"status","required":true,"in":"query","schema":{"type":"string"}},{"name":"priority","required":true,"in":"query","schema":{"type":"string"}},{"name":"category","required":true,"in":"query","schema":{"type":"string"}},{"name":"dueDateFrom","required":true,"in":"query","schema":{"type":"string"}},{"name":"dueDateTo","required":true,"in":"query","schema":{"type":"string"}},{"name":"sortBy","required":true,"in":"query","schema":{"type":"string"}},{"name":"sortOrder","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["PersonalItems"]},"post":{"operationId":"PersonalItemsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePersonalItemDto"}}}},"responses":{"201":{"description":""}},"tags":["PersonalItems"]}},"/api/v1/personal-items/stats":{"get":{"operationId":"PersonalItemsController_stats","parameters":[],"responses":{"200":{"description":""}},"tags":["PersonalItems"]}},"/api/v1/personal-items/categories":{"get":{"operationId":"PersonalItemsController_categories","parameters":[],"responses":{"200":{"description":""}},"tags":["PersonalItems"]}},"/api/v1/personal-items/archived":{"get":{"operationId":"PersonalItemsController_archived","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"pageSize","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["PersonalItems"]}},"/api/v1/personal-items/{id}":{"get":{"operationId":"PersonalItemsController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["PersonalItems"]},"patch":{"operationId":"PersonalItemsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePersonalItemDto"}}}},"responses":{"200":{"description":""}},"tags":["PersonalItems"]},"delete":{"operationId":"PersonalItemsController_delete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["PersonalItems"]}},"/api/v1/personal-items/{id}/archive":{"post":{"operationId":"PersonalItemsController_archive","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["PersonalItems"]}},"/api/v1/personal-items/{id}/restore":{"post":{"operationId":"PersonalItemsController_restore","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["PersonalItems"]}},"/api/v1/personal-items/extract-from-text":{"post":{"operationId":"PersonalItemsController_extractFromText","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractFromTextDto"}}}},"responses":{"201":{"description":""}},"tags":["PersonalItems"]}},"/api/v1/personal-items/extract-from-file":{"post":{"operationId":"PersonalItemsController_extractFromFile","parameters":[],"responses":{"201":{"description":""}},"tags":["PersonalItems"]}},"/api/v1/personal-items/extract-from-image":{"post":{"operationId":"PersonalItemsController_extractFromImage","parameters":[],"responses":{"201":{"description":""}},"tags":["PersonalItems"]}},"/api/v1/personal-items/extract-from-ocr-text":{"post":{"operationId":"PersonalItemsController_extractFromOcrText","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractFromTextDto"}}}},"responses":{"201":{"description":""}},"tags":["PersonalItems"]}},"/api/v1/personal-items/bulk-create":{"post":{"operationId":"PersonalItemsController_bulkCreate","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCreatePersonalItemsDto"}}}},"responses":{"201":{"description":""}},"tags":["PersonalItems"]}},"/api/v1/personal-items/dependencies":{"post":{"operationId":"PersonalItemsController_createDependency","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCrossTypeDependencyDto"}}}},"responses":{"201":{"description":""}},"tags":["PersonalItems"]}},"/api/v1/personal-items/dependencies/{id}":{"delete":{"operationId":"PersonalItemsController_removeDependency","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["PersonalItems"]}},"/api/v1/personal-items/{id}/dependencies":{"get":{"operationId":"PersonalItemsController_getItemDependencies","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["PersonalItems"]}},"/api/v1/developer/api-keys":{"post":{"operationId":"DeveloperController_createApiKey","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyDto"}}}},"responses":{"201":{"description":""}},"tags":["Developer"]},"get":{"operationId":"DeveloperController_listApiKeys","parameters":[],"responses":{"200":{"description":""}},"tags":["Developer"]}},"/api/v1/developer/api-keys/{id}":{"delete":{"operationId":"DeveloperController_revokeApiKey","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Developer"]}},"/api/v1/developer/webhooks":{"post":{"operationId":"DeveloperController_createWebhook","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookDto"}}}},"responses":{"201":{"description":""}},"tags":["Developer"]},"get":{"operationId":"DeveloperController_listWebhooks","parameters":[],"responses":{"200":{"description":""}},"tags":["Developer"]}},"/api/v1/developer/webhooks/{id}":{"put":{"operationId":"DeveloperController_updateWebhook","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookDto"}}}},"responses":{"200":{"description":""}},"tags":["Developer"]},"delete":{"operationId":"DeveloperController_deleteWebhook","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Developer"]}},"/api/v1/developer/webhooks/{id}/deliveries":{"get":{"operationId":"DeveloperController_getDeliveries","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"pageSize","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Developer"]}},"/api/v1/integrations/{provider}/status":{"get":{"operationId":"IntegrationsController_getStatus","parameters":[{"name":"provider","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Integrations"]}},"/api/v1/integrations/{provider}/disconnect":{"delete":{"operationId":"IntegrationsController_disconnect","parameters":[{"name":"provider","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Integrations"]}},"/api/v1/integrations/status":{"get":{"operationId":"IntegrationsController_getAllStatuses","parameters":[],"responses":{"200":{"description":""}},"tags":["Integrations"]}},"/api/v1/integrations/fireflies/connect":{"post":{"operationId":"IntegrationsController_connectFireflies","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFirefliesDto"}}}},"responses":{"201":{"description":""}},"tags":["Integrations"]}},"/api/v1/integrations/grain/connect":{"post":{"operationId":"IntegrationsController_connectGrain","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectApiKeyDto"}}}},"responses":{"201":{"description":""}},"tags":["Integrations"]}},"/api/v1/integrations/tldv/connect":{"post":{"operationId":"IntegrationsController_connectTldv","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectApiKeyDto"}}}},"responses":{"201":{"description":""}},"tags":["Integrations"]}},"/api/v1/integrations/avoma/connect":{"post":{"operationId":"IntegrationsController_connectAvoma","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectApiKeyDto"}}}},"responses":{"201":{"description":""}},"tags":["Integrations"]}},"/api/v1/integrations/readai/connect":{"post":{"operationId":"IntegrationsController_connectReadAi","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectApiKeyDto"}}}},"responses":{"201":{"description":""}},"tags":["Integrations"]}},"/api/v1/integrations/otter/webhook":{"post":{"operationId":"IntegrationsController_otterWebhook","parameters":[],"responses":{"201":{"description":""}},"tags":["Integrations"]}},"/api/v1/integrations/readai/webhook":{"post":{"operationId":"IntegrationsController_readAiWebhook","parameters":[],"responses":{"201":{"description":""}},"tags":["Integrations"]}},"/api/v1/analytics/summary":{"get":{"operationId":"AnalyticsController_getSummary","parameters":[{"name":"period","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Analytics"]}},"/api/v1/analytics/trends":{"get":{"operationId":"AnalyticsController_getTrends","parameters":[{"name":"period","required":true,"in":"query","schema":{"type":"string"}},{"name":"granularity","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Analytics"]}},"/api/v1/analytics/meetings":{"get":{"operationId":"AnalyticsController_getMeetings","parameters":[{"name":"period","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Analytics"]}},"/api/v1/analytics/team":{"get":{"operationId":"AnalyticsController_getTeam","parameters":[{"name":"period","required":true,"in":"query","schema":{"type":"string"}},{"name":"teamId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Analytics"]}},"/api/v1/analytics/impact":{"get":{"operationId":"AnalyticsController_getImpact","parameters":[{"name":"period","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Analytics"]}},"/api/v1/analytics/export":{"get":{"operationId":"AnalyticsController_exportCsv","parameters":[{"name":"period","required":true,"in":"query","schema":{"type":"string"}},{"name":"type","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Analytics"]}},"/api/v1/dashboard":{"get":{"description":"Returns all dashboard sections: attention items, stats, my items, team items, upcoming meetings, and recent activity. All counts are computed server-side with no cap. Per PRD Part 5 §8.","operationId":"DashboardController_getDashboard","parameters":[],"responses":{"200":{"description":"Dashboard data"}},"security":[{"bearer":[]}],"summary":"Get dashboard data with server-side aggregates","tags":["Dashboard"]}},"/api/v1/waitlist":{"post":{"operationId":"WaitlistController_join","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaitlistDto"}}}},"responses":{"201":{"description":"Request received"}},"summary":"Join the waitlist","tags":["Waitlist"]}}},"info":{"title":"Streamli9 API","description":"AI-powered meeting accountability API","version":"1.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"}},"schemas":{"RefreshTokenDto":{"type":"object","properties":{"refreshToken":{"type":"string","description":"Refresh token"}},"required":["refreshToken"]},"AuthResponseDto":{"type":"object","properties":{"accessToken":{"type":"string","description":"JWT access token"},"refreshToken":{"type":"string","description":"JWT refresh token"},"expiresIn":{"type":"number","description":"Access token expiry in seconds"},"user":{"type":"object","description":"User information"}},"required":["accessToken","refreshToken","expiresIn","user"]},"SubscribeDto":{"type":"object","properties":{"plan":{"type":"string","description":"Plan slug to subscribe to","example":"pro"},"billingCycle":{"type":"string","description":"Billing cycle","example":"MONTHLY","enum":["MONTHLY","ANNUAL"]},"pricingTier":{"type":"string","description":"Pricing tier override","example":"TIER_1","enum":["TIER_1","TIER_2"]}},"required":["plan"]},"PauseDto":{"type":"object","properties":{"resumeAt":{"type":"string","description":"Date to automatically resume (max 1 month)","example":"2026-05-21T00:00:00.000Z"}}},"UpgradeDto":{"type":"object","properties":{"planSlug":{"type":"string","description":"New plan slug to upgrade/downgrade to","example":"pro"}},"required":["planSlug"]},"ChangeBillingCycleDto":{"type":"object","properties":{"billingCycle":{"type":"string","description":"New billing cycle","example":"ANNUAL","enum":["ANNUAL"]}},"required":["billingCycle"]},"TopUpDto":{"type":"object","properties":{"packageSlug":{"type":"string","description":"Top-up package slug","example":"topup-300","enum":["topup-300","topup-1000"]}},"required":["packageSlug"]},"ByoaiKeyDto":{"type":"object","properties":{"provider":{"type":"string","description":"AI provider","example":"openai","enum":["openai","anthropic"]},"apiKey":{"type":"string","description":"API key","example":"sk-proj-..."}},"required":["provider","apiKey"]},"CreateOrgDto":{"type":"object","properties":{"name":{"type":"string","description":"Organization name","example":"Acme Corp"},"plan":{"type":"string","description":"Enterprise plan","example":"ENTERPRISE_PRO","enum":["ENTERPRISE_STARTER","ENTERPRISE_PRO","ENTERPRISE_BYOAI"]},"seatCount":{"type":"number","description":"Number of seats (must be multiple of 5, min 5)","example":10},"billingCycle":{"type":"string","description":"Billing cycle","example":"MONTHLY","enum":["MONTHLY","ANNUAL"]},"pricingTier":{"type":"string","description":"Pricing tier","example":"TIER_1","enum":["TIER_1","TIER_2"]},"allowedDomain":{"type":"string","description":"Domain restriction — only emails from this domain can join (e.g. \"company.com\")","example":"company.com"}},"required":["name","plan"]},"AddMemberDto":{"type":"object","properties":{"email":{"type":"string","description":"Email of user to add","example":"user@example.com"},"role":{"type":"string","description":"Role in the organization","example":"MEMBER","enum":["ADMIN","MEMBER"]}},"required":["email"]},"UpdateSeatsDto":{"type":"object","properties":{"seatCount":{"type":"number","description":"New seat count (must be multiple of 5, min 5)","example":15}},"required":["seatCount"]},"UpdateProfileDto":{"type":"object","properties":{"name":{"type":"string","description":"User display name","example":"John Doe"},"timezone":{"type":"string","description":"User timezone (IANA format, e.g. America/New_York or Asia/Kolkata)","example":"America/New_York"},"gstin":{"type":"string","description":"GSTIN (India only) — 15-char format. Optional. Stored for B2B invoicing so buyers can claim input tax credit.","example":"29ABCDE1234F1Z5"},"billingStateCode":{"type":"string","description":"Two-letter Indian state code (e.g. KA, MH, KL). Drives GST place-of-supply logic. Optional.","example":"KA"}}},"UpdateSettingsDto":{"type":"object","properties":{"emailRemindersEnabled":{"type":"boolean","description":"Enable email reminders","example":true},"desktopNotifications":{"type":"boolean","description":"Enable desktop notifications","example":true},"reminderTiming":{"type":"string","description":"Reminder timing before due date","example":"1_hour_before","enum":["1_hour_before","2_hours_before","1_day_before","2_days_before"]},"quietHoursEnabled":{"type":"boolean","description":"Enable quiet hours (no notifications during this time)","example":false},"quietHoursStart":{"type":"string","description":"Quiet hours start time (24h format)","example":"22:00"},"quietHoursEnd":{"type":"string","description":"Quiet hours end time (24h format)","example":"08:00"},"weeklySummaryEnabled":{"type":"boolean","description":"Enable weekly summary email","example":true},"weeklySummaryDay":{"type":"string","description":"Day to send weekly summary","example":"monday","enum":["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]},"theme":{"type":"string","description":"UI theme preference","example":"dark","enum":["light","dark","system"]},"defaultMeetingPlatform":{"type":"string","description":"Default meeting platform","example":"zoom","enum":["zoom","teams","meet"]},"extractionMode":{"type":"string","description":"Extraction mode for action items","example":"auto","enum":["auto","manual"]},"defaultDueDays":{"type":"number","description":"Default days until action item due date","example":7,"minimum":1,"maximum":30},"notifyOnAutoSend":{"type":"boolean","description":"Notify when action items are auto-sent","example":true},"hourlyRate":{"type":"object","description":"Monthly salary used to compute dollar value of time saved by Streamli9. Stored as a decimal, internally divided by 173 (working hours/month) to derive an hourly rate. Set to null to hide dollar figures in the Impact section.","example":5000,"minimum":0,"maximum":100000000,"nullable":true},"hourlyCurrency":{"type":"object","description":"ISO-4217 currency code for the hourlyRate field. Display-only; no auto-conversion performed.","example":"USD","minLength":3,"maxLength":3,"nullable":true},"roiSalaryPromptDismissed":{"type":"boolean","description":"True if the user clicked \"Skip\" on the salary prompt inside the Impact section. When true, the inline form is replaced by a small persistent \"Add salary\" link.","example":false}}},"RequestDeletionResponseDto":{"type":"object","properties":{}},"CancelDeletionResponseDto":{"type":"object","properties":{}},"DeletionStatusResponseDto":{"type":"object","properties":{}},"RequestExportResponseDto":{"type":"object","properties":{}},"ExportListResponseDto":{"type":"object","properties":{}},"ExportResponseDto":{"type":"object","properties":{}},"CreateMeetingDto":{"type":"object","properties":{"title":{"type":"string","description":"Meeting title","example":"Weekly Team Standup"},"platform":{"type":"string","description":"Meeting platform","example":"zoom","enum":["zoom","teams","meet"]},"startTime":{"type":"string","description":"Meeting start time","example":"2026-02-10T10:00:00.000Z"},"endTime":{"type":"string","description":"Meeting end time","example":"2026-02-10T11:00:00.000Z"},"duration":{"type":"number","description":"Meeting duration in minutes","example":60,"minimum":1},"externalId":{"type":"string","description":"External meeting ID (Zoom/Teams meeting ID)","example":"123456789"},"calendarEventId":{"type":"string","description":"Calendar event ID reference","example":"AAMkAGI2..."},"recurringSeriesId":{"type":"string","description":"Recurring series ID if part of a series","example":"clh1234567890"},"transcriptText":{"type":"string","description":"Raw transcript text for manual import. When provided, meeting is created as COMPLETED and extraction is auto-queued.","example":"John: Let's review the Q1 roadmap..."}},"required":["title","platform","startTime","endTime","duration"]},"UpdateMeetingDto":{"type":"object","properties":{}},"CreateActionItemDto":{"type":"object","properties":{"description":{"type":"string","description":"Action item description","example":"Review the Q1 budget proposal"},"meetingId":{"type":"string","description":"Meeting ID this action item belongs to","example":"clh1234567890"},"notes":{"type":"string","description":"Optional notes or additional context","example":"Check the shared drive for related documents"},"ownerId":{"type":"string","description":"ID of the user assigned as owner. Optional when ownerEmail is provided for a meeting participant who is not a registered user, or for an external owner.","example":"clh0987654321"},"ownerEmail":{"type":"string","description":"Email of the owner. Used for meeting participants who are not registered Streamli9 users, or for external owners (per PRD Part 6 §3.1 — host-only). If the email matches a registered user, the backend will auto-populate ownerId to link them.","example":"external@example.com"},"ownerName":{"type":"string","description":"Display name of the owner. Used for external owners so the UI can render a human-readable name alongside the email.","example":"Jane External"},"dueDate":{"type":"string","description":"Due date for the action item","example":"2026-02-15T00:00:00.000Z"},"priority":{"type":"string","enum":["HIGH","MEDIUM","LOW"],"description":"Priority level","default":"MEDIUM","example":"HIGH"},"status":{"type":"string","enum":["PENDING","IN_PROGRESS","BLOCKED","COMPLETE","CANCELLED"],"description":"Initial status","default":"PENDING","example":"PENDING"}},"required":["description","meetingId"]},"UpdateActionItemDto":{"type":"object","properties":{"description":{"type":"string","description":"Action item description","example":"Review the Q1 budget proposal by EOD"},"notes":{"type":"string","description":"Optional notes or additional context","example":"Check the shared drive for related documents"},"ownerId":{"type":"string","description":"ID of the user assigned as owner","example":"clh0987654321"},"ownerEmail":{"type":"string","description":"Email of the owner. Used for meeting participants who are not registered Streamli9 users, or for external owners. If the email matches a registered user, the backend will auto-populate ownerId to link them. Mirrors the CreateActionItemDto behavior — see PRD Part 3 §2.8.","example":"external@example.com"},"ownerName":{"type":"string","description":"Display name of the owner. Used for external owners so the UI can render a human-readable name alongside the email.","example":"Jane External"},"dueDate":{"type":"string","description":"Due date for the action item","example":"2026-02-15T00:00:00.000Z"},"priority":{"type":"string","enum":["HIGH","MEDIUM","LOW"],"description":"Priority level","example":"HIGH"},"status":{"type":"string","enum":["PENDING","IN_PROGRESS","BLOCKED","COMPLETE","CANCELLED"],"description":"Current status","example":"IN_PROGRESS"}}},"UpdateExtractionStatusDto":{"type":"object","properties":{"status":{"type":"string","enum":["PENDING_REVIEW","APPROVED","SENT","REJECTED","AUTO_SENT"],"description":"New extraction status","example":"APPROVED"},"reason":{"type":"string","description":"Optional reason for rejection","example":"Item not relevant to meeting discussion"}},"required":["status"]},"CreateExtensionRequestDto":{"type":"object","properties":{"requestedNewDueDate":{"type":"string","description":"New due date being requested (ISO-8601). Must be in the future.","example":"2026-06-15T17:00:00Z"},"reason":{"type":"string","description":"Reason for the extension request, free-form text. 1-2000 chars.","example":"Need extra week — waiting on legal review of the draft."}},"required":["requestedNewDueDate","reason"]},"RespondToExtensionRequestDto":{"type":"object","properties":{"hostResponse":{"type":"string","description":"Optional note from the host shown to the requester.","example":"Approved — let me know if you need more time after this."}}},"CreateDependencyDto":{"type":"object","properties":{}},"UpdateReminderSettingsDto":{"type":"object","properties":{}},"SendReminderNowDto":{"type":"object","properties":{}},"PreviewReminderDto":{"type":"object","properties":{}},"AddChannelDto":{"type":"object","properties":{}},"CreateSeriesDto":{"type":"object","properties":{}},"UpdateSeriesDto":{"type":"object","properties":{}},"DetectSeriesDto":{"type":"object","properties":{}},"CarryForwardDto":{"type":"object","properties":{}},"EnableDistributorDto":{"type":"object","properties":{"preferredPaymentMethod":{"type":"string","description":"Preferred payment method for payouts","enum":["DODO_PAYMENTS","UPI","BANK_TRANSFER"],"example":"DODO_PAYMENTS"}}},"RequestPayoutDto":{"type":"object","properties":{"amount":{"type":"number","description":"Payout amount in USD (minimum $10)","example":10},"paymentMethod":{"type":"string","description":"Payment method type (required if paymentMethodId not provided)","enum":["DODO_PAYMENTS","UPI","BANK_TRANSFER"],"example":"UPI"},"paymentDetails":{"type":"object","description":"Additional payment details (required if paymentMethodId not provided)"},"paymentMethodId":{"type":"string","description":"ID of a saved payment method (alternative to paymentMethod + paymentDetails)"}},"required":["amount"]},"CreatePaymentMethodDto":{"type":"object","properties":{"type":{"type":"string","description":"Payment method type","enum":["DODO_PAYMENTS","UPI","BANK_TRANSFER"],"example":"UPI"},"label":{"type":"string","description":"Label for this payment method","example":"My SBI Account"},"details":{"type":"object","description":"Type-specific details (e.g., { upiId }, { email }, { accountHolder, bankName, accountNumber })"},"isDefault":{"type":"boolean","description":"Set as default payment method","default":false}},"required":["type","label","details"]},"UpdatePaymentMethodDto":{"type":"object","properties":{"label":{"type":"string","description":"Updated label","example":"Personal PayPal"},"details":{"type":"object","description":"Updated type-specific details"}}},"CustomReferralCodeDto":{"type":"object","properties":{"code":{"type":"string","description":"Desired custom referral code (4-20 chars, alphanumeric and hyphens only)","example":"JOHNDOE20","minLength":4,"maxLength":20}},"required":["code"]},"SubmitAppealDto":{"type":"object","properties":{}},"AttributeReferralDto":{"type":"object","properties":{"referralCode":{"type":"string","description":"Referral code from the distributor","example":"REF-ABC123"},"email":{"type":"string","description":"Email of the user who signed up","example":"newuser@example.com"},"userId":{"type":"string","description":"User ID of the user who signed up","example":"clx1234567890"}},"required":["referralCode","email","userId"]},"CreatePersonalItemDto":{"type":"object","properties":{}},"UpdatePersonalItemDto":{"type":"object","properties":{}},"ExtractFromTextDto":{"type":"object","properties":{}},"BulkCreatePersonalItemsDto":{"type":"object","properties":{}},"CreateCrossTypeDependencyDto":{"type":"object","properties":{}},"CreateApiKeyDto":{"type":"object","properties":{}},"CreateWebhookDto":{"type":"object","properties":{}},"UpdateWebhookDto":{"type":"object","properties":{}},"ConnectFirefliesDto":{"type":"object","properties":{}},"ConnectApiKeyDto":{"type":"object","properties":{}},"WaitlistDto":{"type":"object","properties":{}}}}}