{"openapi":"3.0.0","info":{"title":"Screenshots Live API","description":"Screenshots Live API","version":"0.1.0","contact":{}},"paths":{"/health":{"get":{"operationId":"HealthController_check","parameters":[],"responses":{"200":{"description":""}},"tags":["Health"]}},"/auth/register":{"post":{"operationId":"AuthController_register","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponseDto"}}}},"400":{"description":"Invalid input"},"409":{"description":"Email already exists"},"429":{"description":"Rate limit exceeded"}},"summary":"Register a new user","tags":["auth"]}},"/auth/login":{"post":{"operationId":"AuthController_login","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponseDto"}}}},"401":{"description":"Invalid credentials"},"403":{"description":"Email address has not been verified"},"429":{"description":"Rate limit exceeded"}},"summary":"Login with email and password","tags":["auth"]}},"/auth/refresh":{"post":{"operationId":"AuthController_refresh","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponseDto"}}}},"401":{"description":"Invalid or expired refresh token"}},"summary":"Refresh access token","tags":["auth"]}},"/auth/revoke":{"post":{"operationId":"AuthController_revoke","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeTokenDto"}}}},"responses":{"204":{"description":""},"401":{"description":"Invalid token"}},"security":[{"bearer":[]}],"summary":"Revoke a refresh token","tags":["auth"]}},"/auth/verify-email":{"post":{"operationId":"AuthController_verifyEmail","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyEmailDto"}}}},"responses":{"200":{"description":""},"400":{"description":"Invalid input"}},"summary":"Verify email address","tags":["auth"]}},"/auth/resend-verification":{"post":{"operationId":"AuthController_resendVerification","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordDto"}}}},"responses":{"200":{"description":""},"429":{"description":"Rate limit exceeded"}},"summary":"Resend verification email","tags":["auth"]}},"/auth/forgot-password":{"post":{"operationId":"AuthController_forgotPassword","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordDto"}}}},"responses":{"200":{"description":""},"429":{"description":"Rate limit exceeded"}},"summary":"Request password reset","tags":["auth"]}},"/auth/reset-password":{"post":{"operationId":"AuthController_resetPassword","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordDto"}}}},"responses":{"200":{"description":""},"400":{"description":"Invalid input"}},"summary":"Reset password with token","tags":["auth"]}},"/auth/magic-link":{"post":{"operationId":"AuthController_requestMagicLink","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestMagicLinkDto"}}}},"responses":{"200":{"description":""},"429":{"description":"Rate limit exceeded"}},"summary":"Request magic link login email","tags":["auth"]}},"/auth/magic-link/verify":{"post":{"operationId":"AuthController_verifyMagicLink","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyMagicLinkDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponseDto"}}}},"400":{"description":"Invalid input"},"429":{"description":"Rate limit exceeded"}},"summary":"Verify magic link and login","tags":["auth"]}},"/auth/change-password":{"post":{"operationId":"AuthController_requestPasswordChange","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordDto"}}}},"responses":{"200":{"description":""},"400":{"description":"Invalid input"},"401":{"description":"Invalid credentials"}},"security":[{"bearer":[]}],"summary":"Request password change (sends confirmation email)","tags":["auth"]}},"/auth/change-password/confirm":{"post":{"operationId":"AuthController_confirmPasswordChange","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmPasswordChangeDto"}}}},"responses":{"200":{"description":""},"400":{"description":"Invalid input"}},"security":[{"bearer":[]}],"summary":"Confirm password change via email token","tags":["auth"]}},"/auth/totp/setup":{"post":{"operationId":"AuthController_totpSetup","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotpSetupResponseDto"}}}},"400":{"description":"Invalid input"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Initiate TOTP 2FA setup","tags":["auth"]}},"/auth/totp/verify-setup":{"post":{"operationId":"AuthController_totpVerifySetup","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotpVerifySetupDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotpBackupCodesResponseDto"}}}},"400":{"description":"Invalid input"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Verify TOTP code to complete 2FA setup","tags":["auth"]}},"/auth/totp/verify":{"post":{"operationId":"AuthController_totpVerifyLogin","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotpVerifyLoginDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponseDto"}}}},"400":{"description":"Invalid input"},"429":{"description":"Rate limit exceeded"}},"summary":"Verify TOTP code during login","tags":["auth"]}},"/auth/totp/disable":{"post":{"operationId":"AuthController_totpDisable","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotpDisableDto"}}}},"responses":{"200":{"description":""},"400":{"description":"Invalid input"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Disable two-factor authentication","tags":["auth"]}},"/auth/totp/backup-codes":{"post":{"operationId":"AuthController_totpRegenerateBackupCodes","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotpBackupCodesDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TotpBackupCodesResponseDto"}}}},"400":{"description":"Invalid input"},"429":{"description":"Rate limit exceeded"}},"security":[{"bearer":[]}],"summary":"Regenerate backup codes","tags":["auth"]}},"/uploads/font":{"post":{"operationId":"UploadController_uploadFont","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["font"],"properties":{"font":{"type":"string","format":"binary","description":"TTF or OTF font file (max 10MB)"}}}}}},"responses":{"201":{"description":""},"400":{"description":""},"409":{"description":""},"413":{"description":""}},"security":[{"bearer":[]}],"summary":"Upload a font file (TTF or OTF)","tags":["Uploads"]}},"/uploads/fonts":{"get":{"operationId":"UploadController_listFonts","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List user fonts","tags":["Uploads"]}},"/uploads/font/{id}":{"delete":{"operationId":"UploadController_deleteFont","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}],"summary":"Delete a font","tags":["Uploads"]}},"/uploads/image":{"post":{"operationId":"UploadController_uploadImage","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"image":{"type":"string","format":"binary"}}}}}},"responses":{"201":{"description":""},"400":{"description":""},"413":{"description":""}},"security":[{"bearer":[]}],"summary":"Upload an image file","tags":["Uploads"]}},"/uploads/cache-image":{"post":{"operationId":"UploadController_cacheImage","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CacheExternalImageDto"}}}},"responses":{"201":{"description":""},"400":{"description":""}},"security":[{"bearer":[]}],"summary":"Cache an external image URL","tags":["Uploads"]}},"/uploads/templates/{templateId}/items/{itemId}/picture":{"post":{"operationId":"UploadController_uploadPicture","parameters":[{"name":"templateId","required":true,"in":"path","schema":{"type":"string"}},{"name":"itemId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"picture":{"type":"string","format":"binary"}}}}}},"responses":{"201":{"description":""},"400":{"description":""},"403":{"description":""},"413":{"description":""}},"security":[{"bearer":[]}],"summary":"Upload a picture for a template item (PNG or JPEG, max 2MB)","tags":["Uploads"]},"delete":{"operationId":"UploadController_deletePicture","parameters":[{"name":"templateId","required":true,"in":"path","schema":{"type":"string"}},{"name":"itemId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}],"summary":"Remove picture from item","tags":["Uploads"]}},"/uploads/pictures":{"get":{"operationId":"UploadController_listPictures","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List all user pictures","tags":["Uploads"]}},"/uploads/storage-quota":{"get":{"operationId":"UploadController_getStorageQuota","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get storage quota usage","tags":["Uploads"]}},"/render/jobs":{"get":{"operationId":"RenderController_listJobs","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List current user render jobs","tags":["Render"]}},"/render/dispatch":{"post":{"operationId":"RenderController_dispatch","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DispatchRenderDto"}}}},"responses":{"201":{"description":""},"400":{"description":""},"403":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}],"summary":"Dispatch a new render job","tags":["Render"]}},"/render/{jobId}/status":{"get":{"operationId":"RenderController_getStatus","parameters":[{"name":"jobId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}],"summary":"Get render job status","tags":["Render"]}},"/render/{jobId}/download":{"get":{"operationId":"RenderController_getDownload","parameters":[{"name":"jobId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"404":{"description":""},"409":{"description":""}},"security":[{"bearer":[]}],"summary":"Get render job download URL","tags":["Render"]}},"/render/api":{"post":{"operationId":"RenderApiController_renderApi","parameters":[],"requestBody":{"required":true,"description":"Single-template YAML with overrides","content":{"text/yaml":{"schema":{"type":"string"}}}},"responses":{"201":{"description":""},"400":{"description":""},"403":{"description":""},"404":{"description":""},"429":{"description":""}},"security":[{"bearer":[]}],"summary":"Render template with overrides from YAML","tags":["Pro Render API"]}},"/render/render-with-pictures":{"post":{"operationId":"RenderApiController_renderWithPictures","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"yaml":{"type":"string"},"pictures":{"type":"array","items":{"type":"string","format":"binary"}}}}}}},"responses":{"201":{"description":""},"400":{"description":""},"403":{"description":""},"413":{"description":""}},"security":[{"bearer":[]}],"summary":"Render template with uploaded pictures","tags":["Pro Render API"]}},"/render/openapi.json":{"get":{"operationId":"RenderApiController_getOpenApiSpec","parameters":[],"responses":{"200":{"description":""},"403":{"description":""}},"security":[{"bearer":[]}],"summary":"Download OpenAPI specification","tags":["Pro Render API"]}},"/render/docs":{"get":{"operationId":"RenderApiController_getRenderDocs","parameters":[],"responses":{"200":{"description":""},"403":{"description":""}},"security":[{"bearer":[]}],"summary":"Swagger UI for the Render API","tags":["Pro Render API"]}},"/render/template/{templateId}/yaml":{"get":{"operationId":"RenderApiController_getTemplateYaml","parameters":[{"name":"templateId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"403":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}],"summary":"Get template YAML scaffold for API rendering","tags":["Pro Render API"]}},"/render/get-render/{jobId}":{"get":{"operationId":"RenderApiController_getRender","parameters":[{"name":"jobId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"403":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}],"summary":"Get render job status and download URL","tags":["Pro Render API"]}},"/render/api-docs-config":{"get":{"operationId":"RenderApiController_getApiDocsConfig","parameters":[],"responses":{"200":{"description":""},"403":{"description":""}},"security":[{"bearer":[]}],"summary":"Get render API documentation configuration","tags":["Pro Render API"]}},"/schema/templates.json":{"get":{"operationId":"SchemaController_getTemplatesSchema","parameters":[],"responses":{"200":{"description":""}},"summary":"JSON Schema for templates and items (LLM-friendly)","tags":["schema"]}},"/schema/openapi.json":{"get":{"operationId":"SchemaController_getOpenApi","parameters":[],"responses":{"200":{"description":""}},"summary":"Full public OpenAPI specification","tags":["schema"]}},"/templates/screen-sizes":{"get":{"operationId":"TemplateController_getScreenSizes","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get screen size dimensions","tags":["templates"]}},"/templates/device-frames":{"get":{"operationId":"TemplateController_getDeviceFrames","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List available device frames","tags":["templates"]}},"/templates":{"post":{"operationId":"TemplateController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTemplateDto"}}}},"responses":{"201":{"description":""},"402":{"description":"Tier limit exceeded"}},"security":[{"bearer":[]}],"summary":"Create a new template","tags":["templates"]},"get":{"operationId":"TemplateController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List templates for current user","tags":["templates"]}},"/templates/{id}":{"get":{"operationId":"TemplateController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"403":{"description":"Not the owner of this template"},"404":{"description":"Template not found"}},"security":[{"bearer":[]}],"summary":"Get a template with items","tags":["templates"]},"put":{"operationId":"TemplateController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTemplateDto"}}}},"responses":{"200":{"description":""},"403":{"description":"Not the owner of this template"},"404":{"description":"Template not found"}},"security":[{"bearer":[]}],"summary":"Update template metadata","tags":["templates"]},"delete":{"operationId":"TemplateController_delete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""},"403":{"description":"Not the owner of this template"},"404":{"description":"Template not found"}},"security":[{"bearer":[]}],"summary":"Delete a template","tags":["templates"]}},"/templates/{id}/yaml":{"get":{"operationId":"TemplateController_getYaml","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"403":{"description":"Not the owner of this template"},"404":{"description":"Template not found"}},"security":[{"bearer":[]}],"summary":"Generate template YAML scaffold with swappable fields","tags":["templates"]}},"/templates/{id}/thumbnail":{"put":{"operationId":"TemplateController_uploadThumbnail","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Upload a thumbnail for a template","tags":["templates"]}},"/templates/{id}/duplicate":{"post":{"operationId":"TemplateController_duplicate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateTemplateDto"}}}},"responses":{"201":{"description":""},"402":{"description":"Tier limit exceeded"},"403":{"description":"Not the owner of this template"}},"security":[{"bearer":[]}],"summary":"Duplicate a template","tags":["templates"]}},"/templates/{id}/items/reorder":{"put":{"operationId":"TemplateController_reorderItems","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReorderItemsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Reorder items in a template","tags":["templates"]}},"/templates/{id}/items/bulk":{"put":{"operationId":"TemplateController_bulkUpdateItems","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateItemsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Bulk update all items in a template","tags":["templates"]}},"/templates/{id}/items/{itemId}":{"put":{"operationId":"TemplateController_updateItem","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"itemId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateItemDto"}}}},"responses":{"200":{"description":""},"404":{"description":"Template not found"}},"security":[{"bearer":[]}],"summary":"Update an item","tags":["templates"]},"delete":{"operationId":"TemplateController_deleteItem","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"itemId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Delete an item from a template","tags":["templates"]}},"/user/me/dashboard":{"get":{"operationId":"UserController_getDashboardStats","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get dashboard statistics","tags":["user-profile"]}},"/user/me":{"get":{"operationId":"UserController_getMe","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get current user profile","tags":["user-profile"]},"put":{"operationId":"UserController_updateMe","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Update current user profile","tags":["user-profile"]}},"/user/me/email":{"post":{"operationId":"UserController_requestEmailChange","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestEmailChangeDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Request email change","tags":["user-profile"]}},"/user/me/email/confirm":{"post":{"operationId":"UserController_confirmEmailChange","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmEmailChangeDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Confirm email change","tags":["user-profile"]}},"/user/me/notification-preferences":{"get":{"operationId":"UserController_getNotificationPreferences","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get notification preferences","tags":["user-profile"]},"put":{"operationId":"UserController_updateNotificationPreferences","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateNotificationPreferencesDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Update notification preferences","tags":["user-profile"]}},"/user/me/notifications":{"get":{"operationId":"UserController_listNotifications","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List notifications","tags":["user-profile"]},"delete":{"operationId":"UserController_dismissAllNotifications","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Dismiss all notifications","tags":["user-profile"]}},"/user/me/notifications/read-all":{"put":{"operationId":"UserController_markAllNotificationsRead","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Mark all notifications as read","tags":["user-profile"]}},"/user/me/notifications/{id}/read":{"put":{"operationId":"UserController_markNotificationRead","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Mark notification as read","tags":["user-profile"]}},"/user/me/login-banners":{"get":{"operationId":"UserController_getLoginBanners","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get login banners for authenticated user","tags":["user-profile"]}},"/user/me/login-banners/{id}/dismiss":{"post":{"operationId":"UserController_dismissLoginBanner","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Dismiss a login banner","tags":["user-profile"]}},"/user/me/broadcasts":{"get":{"operationId":"UserController_getBroadcasts","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get broadcasts for authenticated user","tags":["user-profile"]}},"/user/me/broadcasts/{id}/dismiss":{"post":{"operationId":"UserController_dismissBroadcast","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Dismiss a broadcast notification","tags":["user-profile"]}},"/admin/dashboard":{"get":{"operationId":"AdminController_getDashboard","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get admin dashboard data","tags":["admin"]}},"/admin/metrics":{"get":{"operationId":"AdminController_getMetrics","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get platform metrics","tags":["admin"]}},"/admin/users":{"get":{"operationId":"AdminController_listUsers","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List all users","tags":["admin"]}},"/admin/users/{id}":{"get":{"operationId":"AdminController_getUser","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get user by ID","tags":["admin"]},"put":{"operationId":"AdminController_updateUser","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Update user by ID","tags":["admin"]}},"/admin/users/{id}/suspend":{"post":{"operationId":"AdminController_suspendUser","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Suspend a user","tags":["admin"]}},"/admin/device-frames":{"get":{"operationId":"AdminController_getDeviceFrames","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List all device frames","tags":["admin"]},"post":{"operationId":"AdminController_createDeviceFrame","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDeviceFrameDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Create a device frame","tags":["admin"]}},"/admin/device-frames/upload":{"post":{"operationId":"AdminController_uploadDeviceFrameImage","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"frame":{"type":"string","format":"binary"}}}}}},"responses":{"201":{"description":""},"400":{"description":""}},"security":[{"bearer":[]}],"summary":"Upload a device frame image","tags":["admin"]}},"/admin/device-frames/create-with-image":{"post":{"operationId":"AdminController_createDeviceFrameWithImage","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"frame":{"type":"string","format":"binary"},"name":{"type":"string"},"deviceModel":{"type":"string"},"screenshotRegion":{"type":"string","description":"JSON string"}}}}}},"responses":{"201":{"description":""},"400":{"description":""}},"security":[{"bearer":[]}],"summary":"Upload frame image and create device frame in one call","tags":["admin"]}},"/admin/device-frames/{id}":{"put":{"operationId":"AdminController_updateDeviceFrame","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDeviceFrameDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Update a device frame","tags":["admin"]},"delete":{"operationId":"AdminController_deleteDeviceFrame","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Delete a device frame","tags":["admin"]}},"/admin/settings/{key}":{"get":{"operationId":"AdminController_getSystemSettings","parameters":[{"name":"key","required":true,"in":"path","schema":{"maxLength":100,"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get system setting by key","tags":["admin"]}},"/admin/settings":{"put":{"operationId":"AdminController_updateSystemSettings","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSystemSettingsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Update system setting","tags":["admin"]}},"/admin/render-config":{"get":{"operationId":"AdminController_getRenderConfig","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get render swappable config","tags":["admin"]},"put":{"operationId":"AdminController_updateRenderConfig","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRenderSwappableConfigDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Update render swappable config","tags":["admin"]}},"/admin/queue/{status}":{"get":{"operationId":"AdminController_getQueueJobs","parameters":[{"name":"status","required":true,"in":"path","schema":{"maxLength":50,"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get queue jobs by status","tags":["admin"]}},"/admin/queue/{jobId}/retry":{"post":{"operationId":"AdminController_retryQueueJob","parameters":[{"name":"jobId","required":true,"in":"path","schema":{"maxLength":255,"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Retry a failed queue job","tags":["admin"]}},"/admin/users/{id}/subscription":{"get":{"operationId":"AdminController_getSubscription","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get user subscription","tags":["admin"]},"post":{"operationId":"AdminController_updateSubscription","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUpdateSubscriptionDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Update user subscription","tags":["admin"]}},"/admin/storage/buckets":{"get":{"operationId":"AdminController_listStorageBuckets","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List storage buckets","tags":["admin"]}},"/admin/storage/objects":{"get":{"operationId":"AdminController_listStorageObjects","parameters":[{"name":"bucket","required":true,"in":"query","schema":{"maxLength":63,"type":"string"}},{"name":"prefix","required":false,"in":"query","schema":{"maxLength":1024,"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List objects in a storage bucket","tags":["admin"]}},"/admin/storage/presign":{"post":{"operationId":"AdminController_getStoragePresignedUrl","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetStoragePresignedUrlDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get presigned download URL for a storage object","tags":["admin"]}},"/admin/storage/objects/{bucket}/{key}":{"delete":{"operationId":"AdminController_deleteStorageObject","parameters":[{"name":"bucket","required":true,"in":"path","schema":{"maxLength":63,"type":"string"}},{"name":"key","required":true,"in":"path","schema":{"maxLength":1024,"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Delete an object from storage","tags":["admin"]}},"/admin/users/{id}/invoices":{"get":{"operationId":"AdminController_listUserInvoices","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List invoices for a user","tags":["admin"]}},"/admin/users/{id}/payment-events":{"get":{"operationId":"AdminController_listPaymentEvents","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List payment events for a user","tags":["admin"]}},"/admin/storage-usage":{"get":{"operationId":"AdminController_getStorageUsage","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get platform-wide storage usage metrics","tags":["admin"]}},"/admin/users/{id}/storage-usage":{"get":{"operationId":"AdminController_getUserStorageUsage","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get storage usage for a specific user","tags":["admin"]}},"/admin/charts/daily-renders":{"get":{"operationId":"AdminController_getChartDailyRenders","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get daily render counts for the current month","tags":["admin"]}},"/admin/charts/daily-revenue":{"get":{"operationId":"AdminController_getChartDailyRevenue","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get daily revenue for the current month","tags":["admin"]}},"/admin/charts/monthly-revenue":{"get":{"operationId":"AdminController_getChartMonthlyRevenue","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get monthly revenue for the current year","tags":["admin"]}},"/admin/3d-models":{"get":{"operationId":"AdminController_get3dModels","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List all 3D device models","tags":["admin"]},"post":{"operationId":"AdminController_create3dModel","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDeviceFrame3dModelDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Create a 3D device model","tags":["admin"]}},"/admin/3d-models/upload":{"post":{"operationId":"AdminController_upload3dModel","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"model":{"type":"string","format":"binary"}}}}}},"responses":{"201":{"description":""},"400":{"description":""}},"security":[{"bearer":[]}],"summary":"Upload a 3D model file (GLB/glTF)","tags":["admin"]}},"/admin/3d-models/{id}":{"put":{"operationId":"AdminController_update3dModel","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDeviceFrame3dModelDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Update a 3D device model","tags":["admin"]},"delete":{"operationId":"AdminController_delete3dModel","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Delete a 3D device model","tags":["admin"]}},"/admin/broadcasts":{"post":{"operationId":"AdminController_createBroadcast","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAdminBroadcastDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Create admin broadcast notification","tags":["admin"]},"get":{"operationId":"AdminController_listBroadcasts","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List all admin broadcasts","tags":["admin"]}},"/admin/broadcasts/{id}":{"delete":{"operationId":"AdminController_deactivateBroadcast","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Deactivate admin broadcast","tags":["admin"]}},"/admin/login-banners":{"post":{"operationId":"AdminController_createLoginBanner","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLoginBannerDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Create login banner","tags":["admin"]},"get":{"operationId":"AdminController_listLoginBanners","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List all login banners","tags":["admin"]}},"/admin/login-banners/{id}":{"put":{"operationId":"AdminController_updateLoginBanner","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLoginBannerDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Update login banner","tags":["admin"]},"delete":{"operationId":"AdminController_deactivateLoginBanner","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Deactivate login banner","tags":["admin"]}},"/admin/users/{userId}/impersonate":{"post":{"operationId":"AdminController_impersonateUser","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Impersonate a user","tags":["admin"]}},"/admin/impersonation/stop":{"post":{"operationId":"AdminController_stopImpersonation","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"Stop impersonating a user","tags":["admin"]}},"/admin/users/{userId}/activity":{"get":{"operationId":"AdminController_getUserActivity","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"action","required":true,"in":"query","schema":{"type":"string"}},{"name":"resourceType","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get user activity logs","tags":["admin"]}},"/webhooks/payment":{"post":{"operationId":"PaymentWebhookController_handleWebhook","parameters":[{"name":"stripe-signature","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":""}},"summary":"Handle payment webhook","tags":["Payment"]}},"/payment/prices":{"get":{"operationId":"PaymentController_prices","parameters":[],"responses":{"200":{"description":""}},"summary":"Get public tier prices","tags":["Payment"]}},"/payment/tier-features":{"get":{"operationId":"PaymentController_tierFeatures","parameters":[],"responses":{"200":{"description":""}},"summary":"Get subscription tier feature limits","tags":["Payment"]}},"/payment/checkout":{"post":{"operationId":"PaymentController_checkout","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCheckoutDto"}}}},"responses":{"200":{"description":""},"400":{"description":""},"401":{"description":""}},"security":[{"bearer":[]}],"summary":"Create checkout session","tags":["Payment"]}},"/payment/cancel":{"post":{"operationId":"PaymentController_cancel","parameters":[],"responses":{"200":{"description":""},"401":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}],"summary":"Cancel subscription","tags":["Payment"]}},"/payment/reactivate":{"post":{"operationId":"PaymentController_reactivate","parameters":[],"responses":{"200":{"description":""},"400":{"description":""},"401":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}],"summary":"Reactivate cancelled subscription","tags":["Payment"]}},"/payment/invoices":{"get":{"operationId":"PaymentController_invoices","parameters":[],"responses":{"200":{"description":""},"401":{"description":""}},"security":[{"bearer":[]}],"summary":"List user invoices","tags":["Payment"]}},"/payment/validate-code":{"post":{"operationId":"PaymentController_validateCode","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateCodeDto"}}}},"responses":{"200":{"description":""},"400":{"description":""},"401":{"description":""},"429":{"description":""}},"security":[{"bearer":[]}],"summary":"Validate a coupon or affiliate code","tags":["Payment"]}},"/admin/validate":{"post":{"operationId":"CouponController_validate","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateCouponDto"}}}},"responses":{"200":{"description":""},"400":{"description":""},"401":{"description":""},"429":{"description":""}},"security":[{"bearer":[]}],"summary":"Validate a coupon code","tags":["Coupon"]}},"/admin/coupons":{"post":{"operationId":"CouponController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCouponDto"}}}},"responses":{"201":{"description":""},"400":{"description":""},"401":{"description":""},"403":{"description":""},"409":{"description":""}},"security":[{"bearer":[]}],"summary":"Create a new coupon","tags":["Coupon"]},"get":{"operationId":"CouponController_list","parameters":[],"responses":{"200":{"description":""},"401":{"description":""},"403":{"description":""}},"security":[{"bearer":[]}],"summary":"List all coupons","tags":["Coupon"]}},"/admin/coupons/{id}":{"delete":{"operationId":"CouponController_deactivate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":""},"403":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}],"summary":"Deactivate a coupon","tags":["Coupon"]}},"/admin/coupons/{id}/redemptions":{"get":{"operationId":"CouponController_redemptions","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":""},"403":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}],"summary":"List redemptions for a coupon","tags":["Coupon"]}},"/affiliate/generate":{"post":{"operationId":"AffiliateController_generate","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateAffiliateCodeDto"}}}},"responses":{"201":{"description":""},"401":{"description":""},"409":{"description":""},"429":{"description":""}},"security":[{"bearer":[]}],"summary":"Generate an affiliate code","tags":["Affiliate"]}},"/affiliate/me":{"get":{"operationId":"AffiliateController_me","parameters":[],"responses":{"200":{"description":""},"401":{"description":""},"429":{"description":""}},"security":[{"bearer":[]}],"summary":"Get own affiliate info and stats","tags":["Affiliate"]}},"/affiliate/payout-details":{"patch":{"operationId":"AffiliateController_patchPayoutDetails","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePayoutDetailsDto"}}}},"responses":{"200":{"description":""},"401":{"description":""},"404":{"description":""},"429":{"description":""}},"security":[{"bearer":[]}],"summary":"Update payout details for the current affiliate","tags":["Affiliate"]}},"/affiliate/affiliates/user/{userId}":{"get":{"operationId":"AffiliateController_getUserAffiliateInfo","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":""},"403":{"description":""}},"security":[{"bearer":[]}],"summary":"Get affiliate info for a specific user","tags":["Affiliate"]}},"/admin/affiliates":{"get":{"operationId":"AdminAffiliateController_listAffiliates","parameters":[],"responses":{"200":{"description":""},"401":{"description":""},"403":{"description":""}},"security":[{"bearer":[]}],"summary":"List all affiliates with stats","tags":["Affiliate"]}},"/admin/affiliates/{id}/referrals":{"get":{"operationId":"AdminAffiliateController_getReferrals","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":""},"403":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}],"summary":"List referrals for an affiliate","tags":["Affiliate"]}},"/admin/affiliates/{id}/rate":{"patch":{"operationId":"AdminAffiliateController_setRate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSetAffiliateRateDto"}}}},"responses":{"200":{"description":""},"401":{"description":""},"403":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}],"summary":"Set affiliate commission rate","tags":["Affiliate"]}},"/admin/affiliates/payouts":{"post":{"operationId":"AdminAffiliateController_markPayouts","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminMarkAffiliatePayoutDto"}}}},"responses":{"200":{"description":""},"401":{"description":""},"403":{"description":""}},"security":[{"bearer":[]}],"summary":"Mark affiliate referrals as paid","tags":["Affiliate"]}},"/chat/conversations":{"get":{"operationId":"ChatController_conversations","parameters":[],"responses":{"200":{"description":""},"401":{"description":""}},"security":[{"bearer":[]}],"summary":"List conversations","tags":["Chat"]}},"/chat/conversations/{conversationId}/messages":{"get":{"operationId":"ChatController_history","parameters":[{"name":"conversationId","required":true,"in":"path","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":200,"type":"number"}}],"responses":{"200":{"description":""},"401":{"description":""},"403":{"description":""}},"security":[{"bearer":[]}],"summary":"Get chat history with a user","tags":["Chat"]}},"/chat/conversations/{conversationId}/read":{"post":{"operationId":"ChatController_markRead","parameters":[{"name":"conversationId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":""}},"security":[{"bearer":[]}],"summary":"Mark messages as read in a conversation","tags":["Chat"]}},"/templates/{id}/port":{"post":{"operationId":"TemplatePortingController_port","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortTemplateDto"}}}},"responses":{"200":{"description":""},"201":{"description":""},"402":{"description":"Tier limit exceeded"},"403":{"description":"Not the owner of this template"},"404":{"description":"Template not found"}},"security":[{"bearer":[]}],"summary":"Port a template to a different platform","tags":["template-porting"]}},"/admin/backups":{"get":{"operationId":"BackupController_list","parameters":[],"responses":{"200":{"description":""},"401":{"description":""},"403":{"description":""}},"security":[{"bearer":[]}],"summary":"List all backup snapshots","tags":["Backup"]}},"/admin/backups/{id}":{"get":{"operationId":"BackupController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":""},"403":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}],"summary":"Get a backup snapshot by ID","tags":["Backup"]},"delete":{"operationId":"BackupController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""},"401":{"description":""},"403":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}],"summary":"Delete a backup snapshot","tags":["Backup"]}},"/admin/backups/trigger":{"post":{"operationId":"BackupController_trigger","parameters":[],"responses":{"201":{"description":""},"401":{"description":""},"403":{"description":""}},"security":[{"bearer":[]}],"summary":"Trigger a manual database backup","tags":["Backup"]}},"/admin/backups/restore":{"post":{"operationId":"BackupController_restore","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestoreBackupDto"}}}},"responses":{"200":{"description":""},"401":{"description":""},"403":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}],"summary":"Restore from a backup snapshot","tags":["Backup"]}},"/auth/oauth/accounts":{"get":{"operationId":"OAuthController_listAccounts","parameters":[],"responses":{"200":{"description":""},"401":{"description":""}},"security":[{"bearer":[]}],"summary":"List linked OAuth accounts","tags":["oauth"]}},"/auth/oauth/link":{"post":{"operationId":"OAuthController_link","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthCallbackDto"}}}},"responses":{"200":{"description":""},"401":{"description":""},"409":{"description":""}},"security":[{"bearer":[]}],"summary":"Link an OAuth provider to your account","tags":["oauth"]}},"/auth/oauth/{provider}":{"get":{"operationId":"OAuthController_initiate","parameters":[{"name":"provider","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"400":{"description":""},"429":{"description":""}},"summary":"Get OAuth authorization URL for a provider","tags":["oauth"]},"delete":{"operationId":"OAuthController_unlink","parameters":[{"name":"provider","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":""},"409":{"description":""}},"security":[{"bearer":[]}],"summary":"Unlink an OAuth provider from your account","tags":["oauth"]}},"/auth/oauth/{provider}/callback":{"post":{"operationId":"OAuthController_callback","parameters":[{"name":"provider","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthCallbackDto"}}}},"responses":{"200":{"description":""},"400":{"description":""},"429":{"description":""}},"summary":"Exchange OAuth code for tokens","tags":["oauth"]}},"/auth/passkey/register/options":{"post":{"operationId":"PasskeyController_registerOptions","parameters":[],"responses":{"200":{"description":""},"401":{"description":""}},"security":[{"bearer":[]}],"summary":"Get passkey registration options","tags":["passkey"]}},"/auth/passkey/register/verify":{"post":{"operationId":"PasskeyController_registerVerify","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasskeyRegisterVerifyDto"}}}},"responses":{"200":{"description":""},"400":{"description":""},"401":{"description":""}},"security":[{"bearer":[]}],"summary":"Verify passkey registration","tags":["passkey"]}},"/auth/passkey/authenticate/options":{"post":{"operationId":"PasskeyController_authOptions","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasskeyAuthOptionsDto"}}}},"responses":{"200":{"description":""},"429":{"description":""}},"summary":"Get passkey authentication options","tags":["passkey"]}},"/auth/passkey/authenticate/verify":{"post":{"operationId":"PasskeyController_authVerify","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasskeyAuthVerifyDto"}}}},"responses":{"200":{"description":""},"400":{"description":""},"429":{"description":""}},"summary":"Verify passkey authentication and return tokens","tags":["passkey"]}},"/auth/passkey/credentials":{"get":{"operationId":"PasskeyController_listCredentials","parameters":[],"responses":{"200":{"description":""},"401":{"description":""}},"security":[{"bearer":[]}],"summary":"List registered passkeys","tags":["passkey"]}},"/auth/passkey/{id}":{"delete":{"operationId":"PasskeyController_deleteCredential","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}],"summary":"Delete a registered passkey","tags":["passkey"]}},"/api-keys":{"post":{"operationId":"ApiKeyController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyDto"}}}},"responses":{"201":{"description":""},"400":{"description":""},"401":{"description":""},"403":{"description":""}},"security":[{"bearer":[]}],"summary":"Create a new API key","tags":["api-keys"]},"get":{"operationId":"ApiKeyController_list","parameters":[],"responses":{"200":{"description":""},"401":{"description":""}},"security":[{"bearer":[]}],"summary":"List your API keys","tags":["api-keys"]}},"/api-keys/{id}":{"delete":{"operationId":"ApiKeyController_delete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":""},"404":{"description":""}},"security":[{"bearer":[]}],"summary":"Delete an API key","tags":["api-keys"]}},"/webhook-config":{"post":{"operationId":"WebhookConfigController_createWebhookConfig","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookConfigDto"}}}},"responses":{"201":{"description":""},"400":{"description":""},"403":{"description":""}},"security":[{"bearer":[]}],"summary":"Create or update webhook configuration","tags":["Webhook Configuration"]},"get":{"operationId":"WebhookConfigController_getWebhookConfig","parameters":[],"responses":{"200":{"description":""},"403":{"description":""}},"security":[{"bearer":[]}],"summary":"Get current webhook configuration","tags":["Webhook Configuration"]},"delete":{"operationId":"WebhookConfigController_deleteWebhookConfig","parameters":[],"responses":{"204":{"description":""},"403":{"description":""}},"security":[{"bearer":[]}],"summary":"Delete webhook configuration","tags":["Webhook Configuration"]}},"/admin/blog/posts":{"get":{"operationId":"AdminBlogController_listPosts","parameters":[{"name":"page","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["DRAFT","PUBLISHED"]}},{"name":"locale","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"summary":"List all blog posts (admin)","tags":["Admin Blog"]},"post":{"operationId":"AdminBlogController_createPost","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBlogPostDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Create a new blog post","tags":["Admin Blog"]}},"/admin/blog/posts/bulk-status":{"patch":{"operationId":"AdminBlogController_bulkUpdateStatus","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateBlogPostStatusDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Bulk update status for all locales of a slug","tags":["Admin Blog"]}},"/admin/blog/posts/{id}":{"get":{"operationId":"AdminBlogController_getPost","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get a blog post by ID (admin)","tags":["Admin Blog"]},"patch":{"operationId":"AdminBlogController_updatePost","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBlogPostDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Update a blog post","tags":["Admin Blog"]},"delete":{"operationId":"AdminBlogController_deletePost","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Delete a blog post","tags":["Admin Blog"]}},"/blog/posts":{"get":{"operationId":"PublicBlogController_listPosts","parameters":[{"name":"page","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["DRAFT","PUBLISHED"]}},{"name":"locale","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"summary":"List published blog posts","tags":["Blog"]}},"/blog/posts/{slug}":{"get":{"operationId":"PublicBlogController_getPost","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"locale","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get a published blog post by slug","tags":["Blog"]}},"/library/categories":{"get":{"operationId":"LibraryController_listCategories","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List library categories","tags":["library"]}},"/library/templates":{"get":{"operationId":"LibraryController_browse","parameters":[{"name":"categoryId","required":false,"in":"query","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Browse library templates","tags":["library"]}},"/library/templates/{id}":{"get":{"operationId":"LibraryController_getTemplate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"404":{"description":"Library template not found"}},"security":[{"bearer":[]}],"summary":"Get library template detail","tags":["library"]}},"/library/templates/{id}/copy":{"post":{"operationId":"LibraryController_copyTemplate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""},"402":{"description":"Tier limit exceeded"},"404":{"description":"Library template not found"}},"security":[{"bearer":[]}],"summary":"Copy a library template to your workspace","tags":["library"]}},"/library/community/submit":{"post":{"operationId":"LibraryController_submit","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitToCommunityDto"}}}},"responses":{"201":{"description":""},"409":{"description":"Resource conflict"}},"security":[{"bearer":[]}],"summary":"Submit a template for community review","tags":["library"]}},"/library/community/my-submissions":{"get":{"operationId":"LibraryController_mySubmissions","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List my community submissions","tags":["library"]}},"/library/community/my-submissions/{id}":{"delete":{"operationId":"LibraryController_revokeSubmission","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""},"404":{"description":"Library template not found"},"409":{"description":"Resource conflict"}},"security":[{"bearer":[]}],"summary":"Revoke a pending community submission","tags":["library"]}},"/public/library/categories":{"get":{"operationId":"PublicLibraryController_listCategories","parameters":[],"responses":{"200":{"description":""}},"summary":"List library categories (public)","tags":["Public Library"]}},"/public/library/templates":{"get":{"operationId":"PublicLibraryController_browse","parameters":[{"name":"categoryId","required":false,"in":"query","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":""}},"summary":"Browse library templates (public)","tags":["Public Library"]}},"/public/library/templates/{id}":{"get":{"operationId":"PublicLibraryController_getTemplate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"404":{"description":"Library template not found"}},"summary":"Get library template detail (public)","tags":["Public Library"]}},"/admin/library/categories":{"post":{"operationId":"AdminLibraryController_createCategory","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCategoryDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Create a library category","tags":["admin-library"]},"get":{"operationId":"AdminLibraryController_listCategories","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List library categories","tags":["admin-library"]}},"/admin/library/categories/{id}":{"put":{"operationId":"AdminLibraryController_updateCategory","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCategoryDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Update a library category","tags":["admin-library"]},"delete":{"operationId":"AdminLibraryController_deleteCategory","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Delete a library category","tags":["admin-library"]}},"/admin/library/templates/publish":{"post":{"operationId":"AdminLibraryController_publishTemplate","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishAdminTemplateDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Publish a template to the library","tags":["admin-library"]}},"/admin/library/templates/{id}/prepare-edit":{"post":{"operationId":"AdminLibraryController_prepareEdit","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Prepare library template for editing in the visual editor","tags":["admin-library"]}},"/admin/library/templates/{id}/sync-snapshot":{"post":{"operationId":"AdminLibraryController_syncSnapshot","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Sync library template snapshot from source template","tags":["admin-library"]}},"/admin/library/templates/regenerate-previews":{"post":{"operationId":"AdminLibraryController_regeneratePreviews","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Regenerate high-quality previews for all library templates","tags":["admin-library"]}},"/admin/library/templates/{id}":{"delete":{"operationId":"AdminLibraryController_unpublishTemplate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"summary":"Unpublish a library template","tags":["admin-library"]},"put":{"operationId":"AdminLibraryController_updateTemplate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateLibraryTemplateDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Update library template metadata","tags":["admin-library"]}},"/admin/library/templates":{"get":{"operationId":"AdminLibraryController_listTemplates","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List all library templates","tags":["admin-library"]}},"/admin/library/submissions":{"get":{"operationId":"AdminLibraryController_listSubmissions","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List pending community submissions","tags":["admin-library"]}},"/admin/library/submissions/count":{"get":{"operationId":"AdminLibraryController_submissionCount","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get pending submission count","tags":["admin-library"]}},"/admin/library/submissions/{id}":{"get":{"operationId":"AdminLibraryController_getSubmission","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get community submission detail","tags":["admin-library"]}},"/admin/library/submissions/{id}/approve":{"post":{"operationId":"AdminLibraryController_approveSubmission","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveSubmissionDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Approve a community submission","tags":["admin-library"]}},"/admin/library/submissions/{id}/deny":{"post":{"operationId":"AdminLibraryController_denySubmission","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DenySubmissionDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Deny a community submission","tags":["admin-library"]}},"/banners/login":{"get":{"operationId":"PublicBannerController_getLoginBanners","parameters":[],"responses":{"200":{"description":""}},"summary":"Get public login banners","tags":["Public Banners"]}},"/attribution":{"post":{"operationId":"AttributionController_submit","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitAttributionDto"}}}},"responses":{"201":{"description":""},"409":{"description":"User already has an attribution link"}},"security":[{"bearer":[]}],"summary":"Submit an attribution link for verification","tags":["attribution"]},"get":{"operationId":"AttributionController_getMy","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Get my attribution link status","tags":["attribution"]},"delete":{"operationId":"AttributionController_delete","parameters":[],"responses":{"204":{"description":""},"404":{"description":"Attribution link not found"}},"security":[{"bearer":[]}],"summary":"Remove my attribution link","tags":["attribution"]}},"/admin/attribution/pending":{"get":{"operationId":"AdminAttributionController_listPending","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List pending attribution links","tags":["admin-attribution"]}},"/admin/attribution/{id}/verify":{"post":{"operationId":"AdminAttributionController_verify","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"201":{"description":""},"404":{"description":"Attribution link not found"}},"security":[{"bearer":[]}],"summary":"Verify an attribution link","tags":["admin-attribution"]}},"/webhooks/stalwart":{"post":{"operationId":"StalwartWebhookController_handleWebhook","parameters":[],"responses":{"200":{"description":""}},"summary":"Receive delivery failure events from Stalwart","tags":["Stalwart Webhooks"]}}}}