{"openapi":"3.1.0","info":{"title":"Mockupper API","description":"Screen mock up creator API","version":"1.0.0"},"paths":{"/api/v1/hot-update/update.json":{"get":{"tags":["Hot Update","Hot Update"],"summary":"Serve Update Json","description":"Serve the OTA update manifest file.\n\nReturns update.json for React Native CodePush/hot updates.\nContains version info and URLs for platform-specific bundles.\n\nReturns:\n    JSON response with update manifest","operationId":"serve_update_json_api_v1_hot_update_update_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/hot-update/bundle-ios.zip":{"get":{"tags":["Hot Update","Hot Update"],"summary":"Serve Ios Bundle","description":"Serve iOS OTA update bundle.\n\nReturns the iOS JavaScript bundle for hot updates.\n\nReturns:\n    ZIP file containing iOS bundle","operationId":"serve_ios_bundle_api_v1_hot_update_bundle_ios_zip_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/hot-update/bundle-android.zip":{"get":{"tags":["Hot Update","Hot Update"],"summary":"Serve Android Bundle","description":"Serve Android OTA update bundle.\n\nReturns the Android JavaScript bundle for hot updates.\n\nReturns:\n    ZIP file containing Android bundle","operationId":"serve_android_bundle_api_v1_hot_update_bundle_android_zip_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/hot-update/channels/{channel}/runtimes/{runtime_version}/update.json":{"get":{"tags":["Hot Update","Hot Update"],"summary":"Serve Runtime Update Json","description":"Serve a manifest isolated to one native runtime and release channel.","operationId":"serve_runtime_update_json_api_v1_hot_update_channels__channel__runtimes__runtime_version__update_json_get","parameters":[{"name":"channel","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._-]+$","title":"Channel"}},{"name":"runtime_version","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._-]+$","title":"Runtime Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/hot-update/channels/{channel}/runtimes/{runtime_version}/bundle-ios.zip":{"get":{"tags":["Hot Update","Hot Update"],"summary":"Serve Runtime Ios Bundle","description":"Serve an iOS bundle isolated to one native runtime and channel.","operationId":"serve_runtime_ios_bundle_api_v1_hot_update_channels__channel__runtimes__runtime_version__bundle_ios_zip_get","parameters":[{"name":"channel","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._-]+$","title":"Channel"}},{"name":"runtime_version","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._-]+$","title":"Runtime Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/hot-update/channels/{channel}/runtimes/{runtime_version}/bundle-android.zip":{"get":{"tags":["Hot Update","Hot Update"],"summary":"Serve Runtime Android Bundle","description":"Serve an Android bundle isolated to one native runtime and channel.","operationId":"serve_runtime_android_bundle_api_v1_hot_update_channels__channel__runtimes__runtime_version__bundle_android_zip_get","parameters":[{"name":"channel","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._-]+$","title":"Channel"}},{"name":"runtime_version","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9._-]+$","title":"Runtime Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/meta/lead":{"post":{"tags":["Analytics"],"summary":"Track Meta Lead","description":"Track a 'Lead' event (e.g. clicking 'Download' or 'Go to App' from landing page).\nSends the event directly to Meta Conversions API via BackgroundTasks.","operationId":"track_meta_lead_api_v1_analytics_meta_lead_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackLeadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackLeadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/mockupper-openclaw/{slug}":{"get":{"tags":["OpenClaw Assets"],"summary":"Get Openclaw Asset","description":"Stream a public asset from the OpenClaw asset bucket.","operationId":"get_openclaw_asset_mockupper_openclaw__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"error":"Internal server error","error_code":"internal_error"},"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/types/project":{"get":{"tags":["Types"],"summary":" Project","operationId":"_project_api_v1_types_project_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}}}}},"/api/v1/types/project/create":{"get":{"tags":["Types"],"summary":" Project Create","operationId":"_project_create_api_v1_types_project_create_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreate"}}}}}}},"/api/v1/types/project/update":{"get":{"tags":["Types"],"summary":" Project Update","operationId":"_project_update_api_v1_types_project_update_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectUpdate"}}}}}}},"/api/v1/types/project/version":{"get":{"tags":["Types"],"summary":" Project Version","operationId":"_project_version_api_v1_types_project_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectVersion"}}}}}}},"/api/v1/types/project/version/base":{"get":{"tags":["Types"],"summary":" Project Version Base","operationId":"_project_version_base_api_v1_types_project_version_base_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectVersionBase"}}}}}}},"/api/v1/types/project/platform-config":{"get":{"tags":["Types"],"summary":" Platform Config","operationId":"_platform_config_api_v1_types_project_platform_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformConfig"}}}}}}},"/api/v1/types/project/device-target-size":{"get":{"tags":["Types"],"summary":" Device Target Size","operationId":"_device_target_size_api_v1_types_project_device_target_size_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceTargetSize"}}}}}}},"/api/v1/types/project/screenshot-group":{"get":{"tags":["Types"],"summary":" Screenshot Group","operationId":"_screenshot_group_api_v1_types_project_screenshot_group_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScreenshotGroup"}}}}}}},"/api/v1/types/project/mockup-screen":{"get":{"tags":["Types"],"summary":" Mockup Screen","operationId":"_mockup_screen_api_v1_types_project_mockup_screen_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MockupScreen"}}}}}}},"/api/v1/types/project/guide-screenshot":{"get":{"tags":["Types"],"summary":" Guide Screenshot","operationId":"_guide_screenshot_api_v1_types_project_guide_screenshot_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuideScreenshot"}}}}}}},"/api/v1/types/project/text-element":{"get":{"tags":["Types"],"summary":" Text Element","operationId":"_text_element_api_v1_types_project_text_element_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TextElement"}}}}}}},"/api/v1/types/project/generation":{"get":{"tags":["Types"],"summary":" Generation","operationId":"_generation_api_v1_types_project_generation_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Generation"}}}}}}},"/api/v1/types/project/types":{"get":{"tags":["Types"],"summary":" Project Types","operationId":"_project_types_api_v1_types_project_types_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectTypesResponse"}}}}}}},"/api/v1/types/project/canvas-defaults":{"get":{"tags":["Types"],"summary":" Canvas Defaults","operationId":"_canvas_defaults_api_v1_types_project_canvas_defaults_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CanvasDefaults"}}}}}}},"/api/v1/types/render/job":{"get":{"tags":["Types"],"summary":" Render Job","operationId":"_render_job_api_v1_types_render_job_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenderJob"}}}}}}},"/api/v1/types/user/profile":{"get":{"tags":["Types"],"summary":" User Profile","operationId":"_user_profile_api_v1_types_user_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileInDB"}}}}}}},"/api/v1/types/firestore/collection-name":{"get":{"tags":["Types"],"summary":" Firestore Collection Name","operationId":"_firestore_collection_name_api_v1_types_firestore_collection_name_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MockupperFirestoreCollectionName"}}}}}}},"/api/v1/types/firestore/subcollection-name":{"get":{"tags":["Types"],"summary":" Firestore Subcollection Name","operationId":"_firestore_subcollection_name_api_v1_types_firestore_subcollection_name_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MockupperFirestoreSubcollectionName"}}}}}}},"/api/v1/types/errors":{"get":{"tags":["Types"],"summary":" Errors","operationId":"_errors_api_v1_types_errors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorTypesResponse"}}}}}}},"/api/v1/auth":{"post":{"tags":["Authentication"],"summary":"Create User","description":"Create a new user with username.\n\nThis is an authentication endpoint - it handles the initial sign-up.\nThe token is verified as part of the authentication process, not via dependency.\nProvider is determined from X-Provider-Id header (firebase, google, apple).\nAutomatically determines the Firebase service (yzfoto/avukatim) from the token.","operationId":"create_user_api_v1_auth_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Provider-Id","in":"header","required":false,"schema":{"$ref":"#/components/schemas/AUTH_PROVIDER"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Authentication"],"summary":"Signin User","description":"Sign in user and get user information.\n\nThis is an authentication endpoint. Returns user profile from Firestore.\nProvider is determined from X-Provider-Id header (firebase, google, apple).\nAutomatically determines the Firebase service (yzfoto/avukatim) from the token.","operationId":"signin_user_api_v1_auth_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"serverAuthCode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Serverauthcode"}},{"name":"firebaseUserId","in":"query","required":true,"schema":{"type":"string","title":"Firebaseuserid"}},{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},{"name":"familyName","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Familyname"}},{"name":"email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"$ref":"#/components/schemas/AUTH_PROVIDER"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserWrapperResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Authentication"],"summary":"Delete User","description":"Delete user account.\n\nThis is an authentication endpoint. Deletes user from Firestore.\nProvider is determined from X-Provider-Id header (firebase, google, apple).\nAutomatically determines the Firebase service (yzfoto/avukatim) from the token.\n\nFor Apple: Also attempts to revoke Apple refresh token.\nFor Firebase: Deletes from both Firebase Auth and Firestore.\nFor Google: Deletes from Firestore only (does not revoke Google OAuth tokens).","operationId":"delete_user_api_v1_auth_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Authentication"],"summary":"Update User Profile","description":"Update current user's profile information.\n\nSupports updating profile fields like `isFirstVisit`.\nAutomatically determines the Firebase service (yzfoto/avukatim) from the token.\nWorks with all authentication providers (Firebase, Google, Apple).\n\n**Authorization:** User can only update their own profile.","operationId":"update_user_profile_api_v1_auth_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/fonts/":{"get":{"tags":["Fonts"],"summary":"List Fonts","description":"Get list of available Google Fonts.","operationId":"list_fonts_api_v1_fonts__get","parameters":[{"name":"search","in":"query","required":false,"schema":{"type":"string","description":"Filter by font family name","title":"Search"},"description":"Filter by font family name"},{"name":"category","in":"query","required":false,"schema":{"type":"string","description":"Filter by category (serif, sans-serif, etc.)","title":"Category"},"description":"Filter by category (serif, sans-serif, etc.)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GoogleFont"},"title":"Response List Fonts Api V1 Fonts  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/render/generate-version":{"post":{"tags":["Generating Mockups"],"summary":"Generate Version Mockups","description":"Triggers async mockup generation.\nReturns jobId.","operationId":"generate_version_mockups_api_v1_render_generate_version_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateVersionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateVersionResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Authentication failed","error_code":"unauthorized"},"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"error":"Internal server error","error_code":"internal_error"},"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/render/translate-version":{"post":{"tags":["Generating Mockups"],"summary":"Translate Version Mockups","description":"Triggers async mockup translation.\nReturns jobId.","operationId":"translate_version_mockups_api_v1_render_translate_version_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateVersionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateVersionResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Authentication failed","error_code":"unauthorized"},"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"error":"Internal server error","error_code":"internal_error"},"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/devices":{"get":{"tags":["Catalog"],"summary":"Get Device Catalog","description":"Get the device catalog with supported platforms, models, and frame assets.\nSupports filtering by search query and platform.","operationId":"get_device_catalog_api_v1_catalog_devices_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceCatalog"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"error":"Internal server error","error_code":"internal_error"},"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/catalog/design-styles":{"get":{"tags":["Catalog"],"summary":"Get Design Styles","description":"Get available design styles with preview SVG URLs.","operationId":"get_design_styles_api_v1_catalog_design_styles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DesignStyleListResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"},"example":{"error":"Internal server error","error_code":"internal_error"}}}}}}},"/api/v1/video/generate":{"post":{"tags":["Video"],"summary":"Generate Video Endpoint","description":"Start a video generation job.","operationId":"generate_video_endpoint_api_v1_video_generate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoGenerateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoGenerateResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Authentication failed","error_code":"unauthorized"},"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"error":"Internal server error","error_code":"internal_error"},"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/video/project/{projectId}/job/{jobId}":{"get":{"tags":["Video"],"summary":"Get Video Job Endpoint","description":"Get a video generation job by ID.","operationId":"get_video_job_endpoint_api_v1_video_project__projectId__job__jobId__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","title":"Projectid"}},{"name":"jobId","in":"path","required":true,"schema":{"type":"string","title":"Jobid"}},{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoDocument"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Authentication failed","error_code":"unauthorized"},"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"error":"Internal server error","error_code":"internal_error"},"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"404":{"description":"Not Found","content":{"application/json":{"example":{"error":"Resource not found","error_code":"not_found"},"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/purchase/google/billing-identity":{"get":{"tags":["Purchase"],"summary":"Get Google Play Billing Identity","description":"Return the authenticated user's opaque Google Play account identifier.","operationId":"get_google_play_billing_identity_api_v1_purchase_google_billing_identity_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GooglePlayBillingIdentityResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/purchase":{"post":{"tags":["Purchase"],"summary":"Handle Purchase","description":"Process an in-app purchase from Google Play Store or Apple App Store.\n\nValidates the purchase token/receipt and processes the purchase for the authenticated user.\n\nArgs:\n    request: Purchase request with OS, product ID, and token/receipt\n    auth: Authenticated user context\n    service: App-specific purchase service (injected)\n\nReturns:\n    PurchaseResponse with success status and subscription details","operationId":"handle_purchase_api_v1_purchase_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Purchase"],"summary":"Get Purchase Info","description":"Get available in-app purchase products.\nAlso sets up freemium credits for the user (authenticated or device-based).\n\nArgs:\n    service: App-specific purchase service (injected)\n    auth: Authentication context (optional)\n\nReturns:\n    InfoResponse with subscribable_skus and consumable_skus products","operationId":"get_purchase_info_api_v1_purchase_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/purchase/":{"post":{"tags":["Purchase"],"summary":"Handle Purchase","description":"Process an in-app purchase from Google Play Store or Apple App Store.\n\nValidates the purchase token/receipt and processes the purchase for the authenticated user.\n\nArgs:\n    request: Purchase request with OS, product ID, and token/receipt\n    auth: Authenticated user context\n    service: App-specific purchase service (injected)\n\nReturns:\n    PurchaseResponse with success status and subscription details","operationId":"handle_purchase_api_v1_purchase__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/purchase/info":{"get":{"tags":["Purchase"],"summary":"Get Purchase Info","description":"Get available in-app purchase products.\nAlso sets up freemium credits for the user (authenticated or device-based).\n\nArgs:\n    service: App-specific purchase service (injected)\n    auth: Authentication context (optional)\n\nReturns:\n    InfoResponse with subscribable_skus and consumable_skus products","operationId":"get_purchase_info_api_v1_purchase_info_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseInfo"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/purchase/subscription-status":{"get":{"tags":["Purchase"],"summary":"Get Subscription Status","description":"Get the user's current subscription status.\n\nArgs:\n    auth: Authenticated user context\n    service: App-specific purchase service (injected)\n\nReturns:\n    PurchaseResponse with subscription status","operationId":"get_subscription_status_api_v1_purchase_subscription_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/purchase/webhook/apple":{"post":{"tags":["Purchase"],"summary":"Handle Apple Webhook","description":"Handle Apple App Store Server Notifications (V2).","operationId":"handle_apple_webhook_api_v1_purchase_webhook_apple_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/purchase/referral/redeem":{"post":{"tags":["Purchase"],"summary":"Redeem Referral","description":"Validate a referral code and return the appropriate master offer code or token.","operationId":"redeem_referral_api_v1_purchase_referral_redeem_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralRedeemRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralRedeemResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/purchase/webhook/google":{"post":{"tags":["Purchase"],"summary":"Handle Google Webhook","description":"Handle Google Play Real-Time Developer Notifications.","operationId":"handle_google_webhook_api_v1_purchase_webhook_google_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/purchase/config":{"get":{"tags":["Purchase"],"summary":"Get Subscription Config","description":"Get subscription configuration including benefits and UI details.","operationId":"get_subscription_config_api_v1_purchase_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaywallConfigResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"},"example":{"error":"Authentication failed","error_code":"unauthorized"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"},"example":{"error":"Internal server error","error_code":"internal_error"}}}}}}},"/api/v1/projects":{"post":{"tags":["Project","project"],"summary":"Create Project","description":"Create a new project.\nEnforces project limits based on user subscription.","operationId":"create_project_api_v1_projects_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/versions/{versionId}/push-app-store":{"post":{"tags":["Project","project"],"summary":"Push Version To App Store","description":"Trigger a background task to push the selected mockups to App Store Connect.","operationId":"push_version_to_app_store_api_v1_versions__versionId__push_app_store_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"versionId","in":"path","required":true,"schema":{"type":"string","title":"Versionid"}},{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushAppStoreRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{projectId}/invites":{"post":{"tags":["Project","project"],"summary":"Create Project Invite","description":"Create a new project invite. The owner will manually send the link.","operationId":"create_project_invite_api_v1_projects__projectId__invites_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","title":"Projectid"}},{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_create_project_invite_api_v1_projects__projectId__invites_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Project Invite Api V1 Projects  Projectid  Invites Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{projectId}/invites/{token}/accept":{"post":{"tags":["Project","project"],"summary":"Accept Project Invite","description":"Accept an invite to become a project manager.","operationId":"accept_project_invite_api_v1_projects__projectId__invites__token__accept_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","title":"Projectid"}},{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{projectId}/access":{"get":{"tags":["Project","project"],"summary":"Get Project Access","description":"Get existing managers and pending invites for a project.","operationId":"get_project_access_api_v1_projects__projectId__access_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","title":"Projectid"}},{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{projectId}/invites/{inviteId}":{"delete":{"tags":["Project","project"],"summary":"Revoke Project Invite","description":"Revoke a pending invite.","operationId":"revoke_project_invite_api_v1_projects__projectId__invites__inviteId__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","title":"Projectid"}},{"name":"inviteId","in":"path","required":true,"schema":{"type":"string","title":"Inviteid"}},{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/projects/{projectId}/managers/{managerId}":{"delete":{"tags":["Project","project"],"summary":"Remove Project Manager","description":"Remove an existing manager.","operationId":"remove_project_manager_api_v1_projects__projectId__managers__managerId__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","title":"Projectid"}},{"name":"managerId","in":"path","required":true,"schema":{"type":"string","title":"Managerid"}},{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mcp/api-keys":{"post":{"tags":["MCP"],"summary":"Create Api Key","description":"Creates a new MCP API key for the authenticated user.","operationId":"create_api_key_api_v1_mcp_api_keys_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Authentication failed","error_code":"unauthorized"},"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"error":"Internal server error","error_code":"internal_error"},"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["MCP"],"summary":"List Api Keys","description":"Lists all active MCP API keys for the authenticated user.","operationId":"list_api_keys_api_v1_mcp_api_keys_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiKeyResponse"},"title":"Response List Api Keys Api V1 Mcp Api Keys Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Authentication failed","error_code":"unauthorized"},"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"error":"Internal server error","error_code":"internal_error"},"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mcp/api-keys/{key_id}":{"delete":{"tags":["MCP"],"summary":"Revoke Api Key","description":"Revokes an MCP API key for the authenticated user.","operationId":"revoke_api_key_api_v1_mcp_api_keys__key_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}},{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Authentication failed","error_code":"unauthorized"},"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"error":"Internal server error","error_code":"internal_error"},"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/app-store-profiles":{"get":{"tags":["App Store Push","App Store Push"],"summary":"List App Store Profiles","description":"List all App Store Connect profiles for the current user.","operationId":"list_app_store_profiles_api_v1_app_store_profiles_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AppStoreProfile"},"title":"Response List App Store Profiles Api V1 App Store Profiles Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["App Store Push","App Store Push"],"summary":"Create App Store Profile","description":"Create a new App Store Connect profile.","operationId":"create_app_store_profile_api_v1_app_store_profiles_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppStoreProfileCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppStoreProfile"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/app-store-profiles/{profile_id}":{"delete":{"tags":["App Store Push","App Store Push"],"summary":"Delete App Store Profile","description":"Delete an App Store Connect profile.","operationId":"delete_app_store_profile_api_v1_app_store_profiles__profile_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"profile_id","in":"path","required":true,"schema":{"type":"string","title":"Profile Id"}},{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/export":{"post":{"tags":["Export","Export"],"summary":"Create Export Job","description":"Start a background job to export mockup screens.\nThe job will compile a ZIP file with organized folders.","operationId":"create_export_job_api_v1_export_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ProviderId","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"Providerid"}},{"name":"X-Provider-Id","in":"header","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AUTH_PROVIDER"},{"type":"null"}],"title":"X-Provider-Id"}},{"name":"X-Device-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Device-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportRequestSchema"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportJob"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"example":{"error":"Authentication failed","error_code":"unauthorized"},"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"example":{"error":"Internal server error","error_code":"internal_error"},"schema":{"$ref":"#/components/schemas/ErrorResponseSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AUTH_PROVIDER":{"type":"string","enum":["firebase","google","apple"],"title":"AUTH_PROVIDER"},"Amount":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"string"}]},"ApiKeyCreateRequest":{"properties":{"name":{"type":"string","maxLength":100,"title":"Name","description":"A friendly name for the API key"}},"type":"object","required":["name"],"title":"ApiKeyCreateRequest"},"ApiKeyResponse":{"properties":{"id":{"type":"string","title":"Id"},"key":{"type":"string","title":"Key","description":"The actual API key. Usually only shown once."},"name":{"type":"string","title":"Name"},"userId":{"type":"string","title":"Userid"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"isActive":{"type":"boolean","title":"Isactive"}},"type":"object","required":["id","key","name","userId","createdAt","isActive"],"title":"ApiKeyResponse"},"AppStoreProfile":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"issuerId":{"type":"string","minLength":1,"title":"Issuerid"},"keyId":{"type":"string","minLength":1,"title":"Keyid"},"p8KeyText":{"type":"string","minLength":1,"title":"P8Keytext"},"id":{"type":"string","title":"Id"},"userId":{"type":"string","title":"Userid"}},"type":"object","required":["name","issuerId","keyId","p8KeyText","id","userId"],"title":"AppStoreProfile"},"AppStoreProfileCreate":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"issuerId":{"type":"string","minLength":1,"title":"Issuerid"},"keyId":{"type":"string","minLength":1,"title":"Keyid"},"p8KeyText":{"type":"string","minLength":1,"title":"P8Keytext"}},"type":"object","required":["name","issuerId","keyId","p8KeyText"],"title":"AppStoreProfileCreate"},"AspectRatio":{"type":"string","enum":["9:19.5","3:4","9:16","16:9"],"title":"AspectRatio","description":"Centralized canvas defaults for preview rendering."},"AuthCreateRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"User's first name"},"familyName":{"type":"string","maxLength":100,"minLength":1,"title":"Familyname","description":"User's last name"},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender","description":"User's gender"}},"type":"object","required":["name","familyName"],"title":"AuthCreateRequest","description":"Request schema for creating user with Firebase/Apple auth.","example":{"displayName":"John Doe","email":"john@example.com","serverAuthCode":"optional_auth_code"}},"BENEFIT_TYPE":{"type":"string","enum":["unlimited"],"title":"BENEFIT_TYPE","description":"Subscription benefit types."},"BackendCanvasRenderSpec":{"properties":{"canvasSizePx":{"anyOf":[{"$ref":"#/components/schemas/PixelRect"},{"type":"null"}]},"deviceRectPx":{"anyOf":[{"$ref":"#/components/schemas/PixelRect"},{"type":"null"}]},"imageRectPx":{"anyOf":[{"$ref":"#/components/schemas/PixelRect"},{"type":"null"}]},"screenViewportRectPx":{"anyOf":[{"$ref":"#/components/schemas/PixelRect"},{"type":"null"}]},"screenViewportBorderRadiusPx":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Screenviewportborderradiuspx","default":0.0},"titleTextLayout":{"anyOf":[{"$ref":"#/components/schemas/TextLayoutSpecPx"},{"type":"null"}]},"descriptionTextLayout":{"anyOf":[{"$ref":"#/components/schemas/TextLayoutSpecPx"},{"type":"null"}]},"imageRotationDeg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Imagerotationdeg","default":0.0},"imageBorderRadiusPx":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Imageborderradiuspx","default":0.0},"colorBorderEnabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Colorborderenabled","default":false},"colorBorderWidth":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Colorborderwidth","default":10},"colorBorderColor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Colorbordercolor","default":"auto"}},"type":"object","title":"BackendCanvasRenderSpec","description":"Backend-only render inputs for pixel-perfect rendering.\n\nThis is intentionally isolated from gesture/editor fields like imagePositionX/Y.\nThe client should persist absolute rectangles in a *known source canvas* coordinate space\n(typically the editor preview canvas). The backend will scale these rects up to the\ncanonical render output size."},"BezelPreset":{"properties":{"borderRadiusFraction":{"type":"number","title":"Borderradiusfraction"},"verticalBezelFraction":{"type":"number","title":"Verticalbezelfraction"},"horizontalBezelFraction":{"type":"number","title":"Horizontalbezelfraction"}},"type":"object","required":["borderRadiusFraction","verticalBezelFraction","horizontalBezelFraction"],"title":"BezelPreset","description":"Bezel calibration constants for a device family."},"BezelPresets":{"properties":{"iphone":{"$ref":"#/components/schemas/BezelPreset"},"androidPhone":{"$ref":"#/components/schemas/BezelPreset"},"ipad":{"$ref":"#/components/schemas/BezelPreset"},"androidTablet":{"$ref":"#/components/schemas/BezelPreset"}},"type":"object","required":["iphone","androidPhone","ipad","androidTablet"],"title":"BezelPresets","description":"All device-family bezel presets used by the renderer."},"Body_create_project_invite_api_v1_projects__projectId__invites_post":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"Body_create_project_invite_api_v1_projects__projectId__invites_post"},"CanvasDefaults":{"properties":{"iphone":{"$ref":"#/components/schemas/CanvasSizePx"},"nineSixteen":{"$ref":"#/components/schemas/CanvasSizePx"},"ipad":{"$ref":"#/components/schemas/CanvasSizePx"}},"type":"object","required":["iphone","nineSixteen","ipad"],"title":"CanvasDefaults","description":"Canonical canvas presets exposed to clients."},"CanvasSizePx":{"properties":{"width":{"type":"integer","title":"Width"},"height":{"type":"integer","title":"Height"}},"type":"object","required":["width","height"],"title":"CanvasSizePx","description":"Pixel dimensions for a canvas preset."},"ConfigBenefitSchema":{"properties":{"amount":{"anyOf":[{"type":"number"},{"$ref":"#/components/schemas/BENEFIT_TYPE"},{"type":"null"}],"title":"Amount"},"feature":{"anyOf":[{"$ref":"#/components/schemas/CreditKey"},{"$ref":"#/components/schemas/FeatureKey"}],"title":"Feature"},"extra":{"anyOf":[{"$ref":"#/components/schemas/ExtraFeatureConfig"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["feature"],"title":"ConfigBenefitSchema"},"ConfigSubscriptionSchema":{"properties":{"period":{"$ref":"#/components/schemas/SubscriptionPeriod"},"tier":{"$ref":"#/components/schemas/SubscriptionTier"},"benefits":{"items":{"$ref":"#/components/schemas/ConfigBenefitSchema"},"type":"array","title":"Benefits"},"discountPercentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Discountpercentage"},"bestValue":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Bestvalue"},"mostPopular":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Mostpopular"}},"type":"object","required":["period","tier","benefits"],"title":"ConfigSubscriptionSchema"},"CreditKey":{"type":"string","enum":["generationCredits"],"title":"CreditKey","description":"Feature identifiers used in quota/usage tracking.\n\nUses Python 3.11+ StrEnum for automatic string conversion in f-strings.\n\nThis Enum provides both:\n- Type hints showing exact allowed values\n- Automatic string value in f-strings (no need for  )\n- Direct string comparisons and operations\n\nUsage:\n    # In function signatures (shows \"recordVisitCount\" | \"chatUsage\" on hover)\n    def track_usage(feature: CreditKey) -> None: ...\n\n    # When calling functions (Enum member auto-converts to string)\n    track_usage(CreditKey.CHAT)  # Uses \"chatUsage\"\n\n    # In f-strings (automatic conversion)\n    # Prints \"Feature: chatUsage\"\n    logger.info(f\"Feature: {CreditKey.CHAT}\")"},"DesignStyleItem":{"properties":{"id":{"type":"string","title":"Id"},"previewSvgUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previewsvgurl"}},"type":"object","required":["id"],"title":"DesignStyleItem","description":"A single design style option returned by the backend."},"DesignStyleListResponse":{"properties":{"styles":{"items":{"$ref":"#/components/schemas/DesignStyleItem"},"type":"array","title":"Styles"}},"type":"object","required":["styles"],"title":"DesignStyleListResponse","description":"Response wrapper for listing design styles."},"DeviceCatalog":{"properties":{"version":{"type":"string","title":"Version"},"platforms":{"additionalProperties":{"$ref":"#/components/schemas/DevicePlatform"},"propertyNames":{"$ref":"#/components/schemas/DeviceCatalogPlatformId"},"type":"object","title":"Platforms"}},"type":"object","required":["version","platforms"],"title":"DeviceCatalog","description":"The full device catalog structure."},"DeviceCatalogPlatformId":{"type":"string","enum":["iphone","ipad","androidPhone","androidTablet"],"title":"DeviceCatalogPlatformId","description":"Exact platform keys used in `apps/mockupper/data/device_catalog.json`."},"DeviceColor":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"frameUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Frameurl"},"frameUrlSvg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Frameurlsvg"},"frameUrlWebp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Frameurlwebp"}},"type":"object","required":["id","name"],"title":"DeviceColor","description":"Represents a specific color variant of a device model."},"DeviceModel":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"width":{"type":"integer","title":"Width"},"height":{"type":"integer","title":"Height"},"screenSize":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screensize"},"colors":{"anyOf":[{"items":{"$ref":"#/components/schemas/DeviceColor"},"type":"array"},{"type":"null"}],"title":"Colors"}},"type":"object","required":["id","name","width","height"],"title":"DeviceModel","description":"Represents a specific device model (e.g., iPhone 14 Pro Max)."},"DevicePlatform":{"properties":{"label":{"type":"string","title":"Label"},"models":{"items":{"$ref":"#/components/schemas/DeviceModel"},"type":"array","title":"Models"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"}},"type":"object","required":["label","models"],"title":"DevicePlatform","description":"Represents a platform category (e.g., iPhone, Android Phone)."},"DevicePosition":{"type":"string","enum":["bottom","bottomLeft","bottomRight","center","left","right","top","topLeft","topRight"],"title":"DevicePosition"},"DeviceTargetSize":{"properties":{"deviceId":{"type":"string","title":"Deviceid"},"width":{"type":"integer","title":"Width"},"height":{"type":"integer","title":"Height"}},"type":"object","required":["deviceId","width","height"],"title":"DeviceTargetSize"},"ErrorResponseSchema":{"properties":{"error":{"type":"string","title":"Error","description":"Human-readable error message"},"error_code":{"type":"string","enum":["internal_error","unauthorized","forbidden","authentication_failed","access_denied","not_found","conflict","job_in_progress","rate_limit_exceeded","validation_error","quota_exceeded","premium_required","insufficient_balance","timeout","service_unavailable","external_service_error","auth_required","invalid_token","auth_failed","auth_or_device_required","verification_failed","signature_content_mismatch","cancelled","email_not_verified"],"title":"Error Code","description":"Machine-readable error code"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details","description":"Additional error details"}},"type":"object","required":["error","error_code"],"title":"ErrorResponseSchema","description":"Standard error response schema for OpenAPI documentation"},"ErrorTypesResponse":{"properties":{"core_error_code":{"anyOf":[{"type":"string","enum":["internal_error","unauthorized","forbidden","authentication_failed","access_denied","not_found","conflict","job_in_progress","rate_limit_exceeded","validation_error","quota_exceeded","premium_required","insufficient_balance","timeout","service_unavailable","external_service_error","auth_required","invalid_token","auth_failed","auth_or_device_required","verification_failed","signature_content_mismatch","cancelled","email_not_verified"]},{"type":"null"}],"title":"Core Error Code"},"mockupper_error_code":{"anyOf":[{"type":"string","enum":["internal_error","unauthorized","forbidden","authentication_failed","access_denied","not_found","conflict","job_in_progress","rate_limit_exceeded","validation_error","quota_exceeded","premium_required","insufficient_balance","timeout","service_unavailable","external_service_error","auth_required","invalid_token","auth_failed","auth_or_device_required","verification_failed","signature_content_mismatch","cancelled","email_not_verified"]},{"type":"string","const":"canvas_url_not_found"},{"type":"null"}],"title":"Mockupper Error Code"}},"type":"object","title":"ErrorTypesResponse","description":"Container for error-code value unions to force them into OpenAPI."},"ExportJob":{"properties":{"id":{"type":"string","title":"Id"},"userId":{"type":"string","title":"Userid"},"projectId":{"type":"string","title":"Projectid"},"versionId":{"type":"string","title":"Versionid"},"groupId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Groupid"},"groupIds":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Groupids"},"locales":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Locales"},"platforms":{"anyOf":[{"items":{"$ref":"#/components/schemas/Platform"},"type":"array"},{"type":"null"}],"title":"Platforms"},"screenshotIds":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Screenshotids"},"status":{"$ref":"#/components/schemas/ExportStatus","default":"pending"},"progress":{"type":"integer","title":"Progress","default":0},"downloadUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Downloadurl"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"logs":{"items":{"type":"string"},"type":"array","title":"Logs"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"}},"type":"object","required":["id","userId","projectId","versionId","createdAt","updatedAt"],"title":"ExportJob"},"ExportRequestSchema":{"properties":{"projectId":{"type":"string","title":"Projectid"},"versionId":{"type":"string","title":"Versionid"},"groupId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Groupid"},"groupIds":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Groupids"},"locales":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Locales"},"platforms":{"anyOf":[{"items":{"$ref":"#/components/schemas/Platform"},"type":"array"},{"type":"null"}],"title":"Platforms"},"screenshotIds":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Screenshotids"}},"type":"object","required":["projectId","versionId"],"title":"ExportRequestSchema"},"ExportStatus":{"type":"string","enum":["pending","processing","completed","failed"],"title":"ExportStatus"},"ExtraFeatureConfig":{"properties":{"amount":{"$ref":"#/components/schemas/Amount"},"feature":{"type":"string","title":"Feature"}},"additionalProperties":false,"type":"object","required":["amount","feature"],"title":"ExtraFeatureConfig","description":"Configuration for extra/bonus features included with a product."},"FeatureKey":{"type":"string","enum":["projectsLimit","everythingStandard","deviceFrames","projectsCount"],"title":"FeatureKey","description":"Feature identifiers used in subscription benefits tracking."},"FontVariantKey":{"type":"string","enum":["regular","italic","100","200","300","400","500","600","700","800","900","100italic","200italic","300italic","400italic","500italic","600italic","700italic","800italic","900italic"],"title":"FontVariantKey","description":"Google Fonts variant keys.\n\nMatches keys used in Google Fonts API `files` map and values used by the client."},"Gender":{"type":"string","enum":["male","female"],"title":"Gender","description":"Gender values."},"GenerateVersionRequest":{"properties":{"projectId":{"type":"string","title":"Projectid"},"versionId":{"type":"string","title":"Versionid"},"groupId":{"type":"string","title":"Groupid"},"screenIds":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Screenids"},"locales":{"anyOf":[{"items":{"$ref":"#/components/schemas/MockupperLocale"},"type":"array"},{"type":"null"}],"title":"Locales"},"platforms":{"anyOf":[{"items":{"$ref":"#/components/schemas/Platform"},"type":"array"},{"type":"null"}],"title":"Platforms"},"batchId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Batchid"},"generationId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generationid"},"quality":{"anyOf":[{"$ref":"#/components/schemas/GenerationQuality"},{"type":"null"}],"default":"pro"},"translateOnlyText":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Translateonlytext","description":"Translate only text"}},"type":"object","required":["projectId","versionId","groupId"],"title":"GenerateVersionRequest"},"GenerateVersionResponse":{"properties":{"jobId":{"type":"string","title":"Jobid"}},"type":"object","required":["jobId"],"title":"GenerateVersionResponse"},"Generation":{"properties":{"id":{"type":"string","title":"Id"},"projectId":{"type":"string","title":"Projectid"},"versionId":{"type":"string","title":"Versionid"},"screenshotGroupId":{"type":"string","title":"Screenshotgroupid"},"screenId":{"type":"string","title":"Screenid"},"batchId":{"type":"string","title":"Batchid"},"imageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imageurl"},"platform":{"$ref":"#/components/schemas/Platform","default":"iphone"},"status":{"$ref":"#/components/schemas/GenerationStatus","default":"pending"},"isFavorite":{"type":"boolean","title":"Isfavorite","default":false},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"stylePreset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stylepreset"},"locale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"}},"type":"object","required":["id","projectId","versionId","screenshotGroupId","screenId","batchId","createdAt"],"title":"Generation","description":"Represents an AI generated image variant.\nPath: projects/{pId}/versions/{vId}/generations/{gId}\nRecommended to keep flat under Version for easier global querying and moving screens."},"GenerationQuality":{"type":"string","enum":["draft","standard","pro"],"title":"GenerationQuality"},"GenerationQualityCost":{"type":"integer","enum":[1,1,2],"title":"GenerationQualityCost"},"GenerationStatus":{"type":"string","enum":["pending","completed","failed"],"title":"GenerationStatus"},"GoogleFont":{"properties":{"family":{"type":"string","title":"Family"},"variants":{"items":{"$ref":"#/components/schemas/FontVariantKey"},"type":"array","title":"Variants"},"subsets":{"items":{"type":"string"},"type":"array","title":"Subsets"},"version":{"type":"string","title":"Version"},"lastModified":{"type":"string","title":"Lastmodified"},"files":{"additionalProperties":{"type":"string"},"type":"object","title":"Files","description":"Mapping of variant to download URL"},"category":{"type":"string","title":"Category"},"kind":{"type":"string","title":"Kind","default":"webfonts#webfont"},"menu":{"type":"string","title":"Menu","description":"Download URL for regular variant ttf (used for menu/preview)","default":""}},"type":"object","required":["family","variants","subsets","version","lastModified","files","category"],"title":"GoogleFont","description":"Representation of a Google Font from the API."},"GooglePlayBillingIdentityResponse":{"properties":{"obfuscatedAccountId":{"type":"string","maxLength":64,"minLength":1,"title":"Obfuscatedaccountid"}},"type":"object","required":["obfuscatedAccountId"],"title":"GooglePlayBillingIdentityResponse","description":"Opaque account identifier supplied to Google Play Billing."},"GuideScreenshot":{"properties":{"id":{"type":"string","title":"Id"},"projectId":{"type":"string","title":"Projectid"},"userId":{"type":"string","title":"Userid"},"imageUrl":{"type":"string","title":"Imageurl"},"storagePath":{"type":"string","title":"Storagepath"},"bytes":{"type":"integer","title":"Bytes"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"fileName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"}},"type":"object","required":["id","projectId","userId","imageUrl","storagePath","bytes","createdAt","updatedAt"],"title":"GuideScreenshot","description":"A guide screenshot uploaded by the user for a specific project."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"MagnifierSelection":{"properties":{"xRatio":{"type":"number","title":"Xratio"},"yRatio":{"type":"number","title":"Yratio"},"widthRatio":{"type":"number","title":"Widthratio"},"heightRatio":{"type":"number","title":"Heightratio"}},"type":"object","required":["xRatio","yRatio","widthRatio","heightRatio"],"title":"MagnifierSelection","description":"Relative coordinates (0.0 to 1.0) defining a selected region on the entire canvas.\nUsed for magnifying part of the mockup for AI generation context."},"MockupScreen":{"properties":{"id":{"type":"string","title":"Id"},"imageUrl":{"type":"string","title":"Imageurl"},"localizedImageUrls":{"anyOf":[{"additionalProperties":{"type":"string"},"propertyNames":{"$ref":"#/components/schemas/MockupperLocale"},"type":"object"},{"type":"null"}],"title":"Localizedimageurls"},"imagePositionX":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Imagepositionx"},"imagePositionY":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Imagepositiony"},"imageScale":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Imagescale"},"backendRenderSpec":{"anyOf":[{"$ref":"#/components/schemas/BackendCanvasRenderSpec"},{"type":"null"}]},"localizedBackendRenderSpecs":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/BackendCanvasRenderSpec"},"propertyNames":{"$ref":"#/components/schemas/MockupperLocale"},"type":"object"},{"type":"null"}],"title":"Localizedbackendrenderspecs"},"title":{"anyOf":[{"$ref":"#/components/schemas/TextElement"},{"type":"null"}]},"description":{"anyOf":[{"$ref":"#/components/schemas/TextElement"},{"type":"null"}]},"aiInstructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aiinstructions"},"magnifierSelection":{"anyOf":[{"$ref":"#/components/schemas/MagnifierSelection"},{"type":"null"}]},"batteryFixEnabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Batteryfixenabled","default":false},"designStyle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Designstyle"},"skipGroupDeviceFrame":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Skipgroupdeviceframe"},"aspectRatio":{"$ref":"#/components/schemas/AspectRatio","default":"9:19.5"},"devicePosition":{"anyOf":[{"$ref":"#/components/schemas/DevicePosition"},{"type":"null"}]},"canvasRenderKey":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canvasrenderkey"},"canvasRenderVersion":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Canvasrenderversion","default":1},"guideScreenshotIds":{"items":{"type":"string"},"type":"array","title":"Guidescreenshotids"},"aiAssetUrls":{"items":{"type":"string"},"type":"array","title":"Aiasseturls"},"createdAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdat"},"updatedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updatedat"}},"type":"object","required":["id","imageUrl"],"title":"MockupScreen","description":"Represents a single screen embedded within a ScreenshotGroup document.\nIdeally, a single group shouldn't exceed ~50-100 screens."},"MockupperFirestoreCollectionName":{"type":"string","enum":["users","anonymousUsers","purchases","monthlyFreemium","projects"],"title":"MockupperFirestoreCollectionName","description":"All Firestore root collection names used by Mockupper."},"MockupperFirestoreSubcollectionName":{"type":"string","enum":["monthlyFreemium","secrets","favorites","versions","screenshots","guideScreenshots","generations","mockups"],"title":"MockupperFirestoreSubcollectionName","description":"All Firestore subcollection names used by Mockupper."},"MockupperLocale":{"type":"string","enum":["ar-SA","ca","cs","da","de-DE","el","en-AU","en-CA","en-GB","en-US","es-ES","es-MX","fi","fr-CA","fr-FR","he","hi","hr","hu","id","it","ja","ko","ms","nl-NL","no","pl","pt-BR","pt-PT","ro","ru","sk","sv","th","tr","uk","vi","zh-Hans","zh-Hant"],"title":"MockupperLocale"},"PaywallConfigResponse":{"properties":{"subscriptions":{"additionalProperties":{"$ref":"#/components/schemas/ConfigSubscriptionSchema"},"type":"object","title":"Subscriptions"},"products":{"additionalProperties":{"$ref":"#/components/schemas/ProductConfig"},"type":"object","title":"Products"}},"type":"object","required":["subscriptions","products"],"title":"PaywallConfigResponse"},"PixelRect":{"properties":{"x":{"type":"number","title":"X"},"y":{"type":"number","title":"Y"},"width":{"type":"number","title":"Width"},"height":{"type":"number","title":"Height"}},"type":"object","required":["x","y","width","height"],"title":"PixelRect","description":"Rectangle in absolute output pixels."},"Platform":{"type":"string","enum":["iphone","ipad","androidPhone","androidTablet"],"title":"Platform"},"PlatformConfig":{"properties":{"status":{"$ref":"#/components/schemas/PlatformStatus","default":"active"},"targetSizes":{"items":{"$ref":"#/components/schemas/DeviceTargetSize"},"type":"array","title":"Targetsizes"}},"type":"object","title":"PlatformConfig","description":"Configuration for platform outputs."},"PlatformStatus":{"type":"string","enum":["active","inactive"],"title":"PlatformStatus"},"ProductConfig":{"properties":{"amount":{"$ref":"#/components/schemas/Amount"},"feature":{"type":"string","title":"Feature"},"extra":{"anyOf":[{"$ref":"#/components/schemas/ExtraFeatureConfig"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["amount","feature"],"title":"ProductConfig","description":"Configuration for a purchasable product."},"Project":{"properties":{"title":{"type":"string","title":"Title"},"coverImage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverimage"},"logoImage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logoimage"},"appStoreProfileId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appstoreprofileid"},"appStoreAppId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appstoreappid"},"managerIds":{"items":{"type":"string"},"type":"array","title":"Managerids"},"id":{"type":"string","title":"Id"},"userId":{"type":"string","title":"Userid"},"status":{"$ref":"#/components/schemas/ProjectStatus","default":"in_progress"},"currentVersionString":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currentversionstring"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"}},"type":"object","required":["title","id","userId","createdAt","updatedAt"],"title":"Project","description":"Represents a document in the 'projects' root collection."},"ProjectCreate":{"properties":{"title":{"type":"string","title":"Title"},"coverImage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverimage"},"logoImage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logoimage"},"appStoreProfileId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appstoreprofileid"},"appStoreAppId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appstoreappid"},"managerIds":{"items":{"type":"string"},"type":"array","title":"Managerids"}},"type":"object","required":["title"],"title":"ProjectCreate"},"ProjectStatus":{"type":"string","enum":["in_progress","completed","archived"],"title":"ProjectStatus"},"ProjectTypesResponse":{"properties":{"aspectRatio":{"anyOf":[{"$ref":"#/components/schemas/AspectRatio"},{"type":"null"}]},"tokenCost":{"$ref":"#/components/schemas/GenerationQualityCost"},"renderJobWarningHighDemand":{"type":"string","title":"Renderjobwarninghighdemand","default":"high_demand"},"modelBezelOverrides":{"additionalProperties":{"$ref":"#/components/schemas/BezelPreset"},"type":"object","title":"Modelbezeloverrides"},"bezels":{"$ref":"#/components/schemas/BezelPresets"}},"type":"object","required":["tokenCost","modelBezelOverrides","bezels"],"title":"ProjectTypesResponse"},"ProjectUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"status":{"anyOf":[{"$ref":"#/components/schemas/ProjectStatus"},{"type":"null"}]},"coverImage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coverimage"},"logoImage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logoimage"},"appStoreProfileId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appstoreprofileid"},"appStoreAppId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appstoreappid"}},"type":"object","title":"ProjectUpdate"},"ProjectVersion":{"properties":{"versionString":{"type":"string","title":"Versionstring"},"status":{"$ref":"#/components/schemas/VersionStatus","default":"draft"},"mainLanguage":{"anyOf":[{"$ref":"#/components/schemas/MockupperLocale"},{"type":"null"}],"default":"en-US"},"additionalLanguages":{"anyOf":[{"items":{"$ref":"#/components/schemas/MockupperLocale"},"type":"array"},{"type":"null"}],"title":"Additionallanguages"},"screenCount":{"type":"integer","title":"Screencount","default":0},"assetCount":{"type":"integer","title":"Assetcount","default":0},"id":{"type":"string","title":"Id"},"projectId":{"type":"string","title":"Projectid"},"isCurrent":{"type":"boolean","title":"Iscurrent","default":false},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"}},"type":"object","required":["versionString","id","projectId","createdAt","updatedAt"],"title":"ProjectVersion","description":"Represents a document in the 'versions' sub-collection."},"ProjectVersionBase":{"properties":{"versionString":{"type":"string","title":"Versionstring"},"status":{"$ref":"#/components/schemas/VersionStatus","default":"draft"},"mainLanguage":{"anyOf":[{"$ref":"#/components/schemas/MockupperLocale"},{"type":"null"}],"default":"en-US"},"additionalLanguages":{"anyOf":[{"items":{"$ref":"#/components/schemas/MockupperLocale"},"type":"array"},{"type":"null"}],"title":"Additionallanguages"},"screenCount":{"type":"integer","title":"Screencount","default":0},"assetCount":{"type":"integer","title":"Assetcount","default":0}},"type":"object","required":["versionString"],"title":"ProjectVersionBase"},"PurchaseInfo":{"properties":{"subscribable_skus":{"items":{"type":"string"},"type":"array","title":"Subscribable Skus"},"consumable_skus":{"items":{"type":"string"},"type":"array","title":"Consumable Skus"},"non_consumable_skus":{"items":{"type":"string"},"type":"array","title":"Non Consumable Skus"}},"type":"object","required":["subscribable_skus","consumable_skus"],"title":"PurchaseInfo","description":"Purchase information with SKUs."},"PurchaseRequest":{"properties":{"os":{"type":"string","title":"Os","description":"Operating system: 'ios' or 'android'"},"productId":{"type":"string","title":"Productid","description":"Product/subscription ID"},"purchaseToken":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Purchasetoken","description":"Google Play purchase token"},"transactionId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transactionid","description":"Transaction ID"},"originalTransactionId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Originaltransactionid","description":"Original transaction ID"},"promoCode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Promocode","description":"Optional promo code for bonuses"}},"type":"object","required":["os","productId"],"title":"PurchaseRequest","description":"Request schema for processing a purchase."},"PurchaseResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"subscription_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Subscription Active"},"expiry_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expiry Date"}},"type":"object","required":["success","message"],"title":"PurchaseResponse","description":"Response schema for purchase processing."},"PushAppStoreRequest":{"properties":{"groupIds":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Groupids"}},"type":"object","title":"PushAppStoreRequest"},"ReferralRedeemRequest":{"properties":{"referral_code":{"type":"string","title":"Referral Code"},"os":{"type":"string","title":"Os"}},"type":"object","required":["referral_code","os"],"title":"ReferralRedeemRequest","description":"Request schema for redeeming a referral code."},"ReferralRedeemResponse":{"properties":{"type":{"type":"string","title":"Type"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"codes":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Codes"},"offerToken":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Offertoken"}},"type":"object","required":["type"],"title":"ReferralRedeemResponse","description":"Response schema for redeeming a referral code."},"RenderJob":{"properties":{"id":{"type":"string","title":"Id"},"userId":{"type":"string","title":"Userid"},"projectId":{"type":"string","title":"Projectid"},"versionId":{"type":"string","title":"Versionid"},"groupId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Groupid"},"screenIds":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Screenids"},"batchId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Batchid"},"assetsPath":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assetspath"},"locales":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Locales"},"platforms":{"anyOf":[{"items":{"$ref":"#/components/schemas/Platform"},"type":"array"},{"type":"null"}],"title":"Platforms"},"generationId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generationid"},"quality":{"anyOf":[{"$ref":"#/components/schemas/GenerationQuality"},{"type":"null"}]},"status":{"type":"string","enum":["queued","processing","completed","failed"],"title":"Status"},"resultUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resulturl"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"errorCode":{"anyOf":[{"type":"string","enum":["internal_error","unauthorized","forbidden","authentication_failed","access_denied","not_found","conflict","job_in_progress","rate_limit_exceeded","validation_error","quota_exceeded","premium_required","insufficient_balance","timeout","service_unavailable","external_service_error","auth_required","invalid_token","auth_failed","auth_or_device_required","verification_failed","signature_content_mismatch","cancelled","email_not_verified"]},{"type":"string","const":"canvas_url_not_found"},{"type":"null"}],"title":"Errorcode"},"warning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Warning"},"progress":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress"},"failedTargets":{"anyOf":[{"items":{"$ref":"#/components/schemas/RenderJobFailedTarget"},"type":"array"},{"type":"null"}],"title":"Failedtargets"},"createdAt":{"title":"Createdat"},"updatedAt":{"title":"Updatedat"}},"type":"object","required":["id","userId","projectId","versionId","status","createdAt","updatedAt"],"title":"RenderJob","description":"Validation schema for reading RenderJob from Firestore (with ID)."},"RenderJobFailedTarget":{"properties":{"locale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locale"},"screenId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screenid"},"platform":{"anyOf":[{"$ref":"#/components/schemas/Platform"},{"type":"null"}]}},"type":"object","title":"RenderJobFailedTarget"},"ScreenshotGroup":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title"},"screens":{"items":{"$ref":"#/components/schemas/MockupScreen"},"type":"array","title":"Screens"},"versionId":{"type":"string","title":"Versionid"},"projectId":{"type":"string","title":"Projectid"},"outputSettings":{"anyOf":[{"$ref":"#/components/schemas/ScreenshotGroupOutputSettings"},{"type":"null"}]},"selections":{"additionalProperties":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"$ref":"#/components/schemas/SpecialSelection"}]},"propertyNames":{"$ref":"#/components/schemas/Platform"},"type":"object"},"type":"object"},"type":"object","title":"Selections"},"mainLanguage":{"anyOf":[{"$ref":"#/components/schemas/MockupperLocale"},{"type":"null"}],"default":"en-US"},"additionalLanguages":{"anyOf":[{"items":{"$ref":"#/components/schemas/MockupperLocale"},"type":"array"},{"type":"null"}],"title":"Additionallanguages"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"}},"type":"object","required":["id","title","versionId","projectId","createdAt","updatedAt"],"title":"ScreenshotGroup","description":"Represents a document in the 'screenshots' sub-collection.\nUsed for batching screens (e.g. \"Onboarding Flow\", \"Settings\")."},"ScreenshotGroupOutputSettings":{"properties":{"deviceFrameId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deviceframeid"},"platforms":{"additionalProperties":{"$ref":"#/components/schemas/PlatformConfig"},"propertyNames":{"$ref":"#/components/schemas/Platform"},"type":"object","title":"Platforms"}},"type":"object","title":"ScreenshotGroupOutputSettings","description":"Output settings for a screenshot group.\nEmbedded directly in the ScreenshotGroup document."},"SpecialSelection":{"type":"string","enum":["raw"],"title":"SpecialSelection","description":"Special values for generation selections."},"SubscriptionDetails":{"properties":{"productId":{"type":"string","title":"Productid"},"isActive":{"type":"boolean","title":"Isactive"},"platform":{"type":"string","title":"Platform","default":"unknown"},"expiresAt":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expiresat"},"isRefunded":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Isrefunded","default":false}},"type":"object","required":["productId","isActive"],"title":"SubscriptionDetails","description":"Individual subscription details."},"SubscriptionPeriod":{"type":"string","enum":["monthly","yearly"],"title":"SubscriptionPeriod"},"SubscriptionStatus":{"properties":{"hasActiveSubscription":{"type":"boolean","title":"Hasactivesubscription"},"subscriptions":{"items":{"$ref":"#/components/schemas/SubscriptionDetails"},"type":"array","title":"Subscriptions"}},"type":"object","required":["hasActiveSubscription","subscriptions"],"title":"SubscriptionStatus","description":"User's subscription status."},"SubscriptionTier":{"type":"string","enum":["standard","pro"],"title":"SubscriptionTier"},"TextAlign":{"type":"string","enum":["left","center","right"],"title":"TextAlign"},"TextElement":{"properties":{"content":{"type":"string","title":"Content"},"translations":{"additionalProperties":{"type":"string"},"propertyNames":{"$ref":"#/components/schemas/MockupperLocale"},"type":"object","title":"Translations"},"layouts":{"additionalProperties":{"$ref":"#/components/schemas/TextElementLayout"},"propertyNames":{"$ref":"#/components/schemas/MockupperLocale"},"type":"object","title":"Layouts"},"fontType":{"type":"string","title":"Fonttype"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"visible":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Visible","default":true},"textAlign":{"anyOf":[{"$ref":"#/components/schemas/TextAlign"},{"type":"null"}]},"fontSize":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fontsize"},"positionX":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Positionx"},"positionY":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Positiony"},"wrapperWidthPx":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wrapperwidthpx"}},"type":"object","required":["content","fontType"],"title":"TextElement","description":"Represents text on the canvas.\n- 'content': Holds the text for the ProjectVersion's 'mainLanguage'.\n- 'translations': Holds overrides for 'additionalLanguages' (key=locale code)."},"TextElementLayout":{"properties":{"fontSize":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Fontsize"},"positionX":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Positionx"},"positionY":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Positiony"},"wrapperWidthPx":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wrapperwidthpx"},"isManuallyAdjusted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ismanuallyadjusted","default":false}},"type":"object","title":"TextElementLayout","description":"Layout properties for a specific locale."},"TextLayoutSpecPx":{"properties":{"textRectPx":{"$ref":"#/components/schemas/PixelRect"},"lines":{"items":{"$ref":"#/components/schemas/TextLineLayoutPx"},"type":"array","title":"Lines"},"fontType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fonttype"}},"type":"object","required":["textRectPx"],"title":"TextLayoutSpecPx","description":"Pixel-perfect text layout (origin rect + line-by-line layout)."},"TextLineLayoutPx":{"properties":{"text":{"type":"string","title":"Text"},"x":{"type":"number","title":"X"},"y":{"type":"number","title":"Y"},"width":{"type":"number","title":"Width"},"height":{"type":"number","title":"Height"}},"type":"object","required":["text","x","y","width","height"],"title":"TextLineLayoutPx","description":"A single pre-wrapped line as measured by React Native via onTextLayout."},"TrackLeadRequest":{"properties":{"action_source":{"type":"string","title":"Action Source","description":"Where the action occurred (e.g. 'website')","default":"website"},"event_source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Source Url","description":"The URL the user was on"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Optional email if they provided one"},"fbc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fbc","description":"Facebook Click ID cookie (_fbc)"},"fbp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fbp","description":"Facebook Browser ID cookie (_fbp)"},"event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Id","description":"Event ID generated on frontend for CAPI deduplication"},"fbclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fbclid","description":"Raw Facebook Click ID from URL"}},"type":"object","title":"TrackLeadRequest","description":"Request payload from the Landing Page when a user clicks 'Download' or 'Go to App'."},"TrackLeadResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"TrackLeadResponse"},"UserPreferences":{"properties":{"hasConfirmedThirdPartyAI":{"type":"boolean","title":"Hasconfirmedthirdpartyai","description":"Whether the user has confirmed understanding of third-party AI usage","default":false}},"type":"object","title":"UserPreferences"},"UserProfileInDB":{"properties":{"providerId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Providerid","description":"Authentication provider ID"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"User's unique identifier"},"uid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uid","description":"Firebase user ID"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email","description":"User's email address"},"displayName":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Displayname","description":"Display name (auto-derived from firstName or email if not provided)"},"name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Name","description":"User's first name"},"familyName":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Familyname","description":"User's last name"},"gender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gender","description":"User's gender"},"emailVerified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Emailverified","description":"Indicates if the user's email is verified"},"profilePhoto":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profilephoto","description":"User's profile photo URL"},"avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar","description":"Avatar seed or string identifier"},"authAccessToken":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authaccesstoken","description":"Authentication access token"},"authRefreshToken":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authrefreshtoken","description":"Authentication refresh token"},"credits":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"number"}]},"type":"object"},{"type":"null"}],"title":"Credits","description":"User's credit balance map by feature (e.g., {chat: 100, default: 50})"},"isFirstVisit":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Isfirstvisit","description":"Indicates if this is the user's first visit","default":false},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Createdat","description":"Timestamp when the user was created (set automatically)"},"updatedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updatedat","description":"Timestamp when the user was last updated (set automatically)"},"fcmTokens":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Fcmtokens","description":"FCM tokens for push notifications"},"subscriptions":{"items":{"$ref":"#/components/schemas/UserSubscriptionSchema"},"type":"array","title":"Subscriptions","description":"User's subscriptions"},"isPremium":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ispremium","description":"Indicates if the user has any active subscriptions (computed field, not stored in DB)","default":false},"hasTriggeredSalesNotification":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Hastriggeredsalesnotification","description":"Whether the user has triggered a sales notification on first launch","default":false},"appLanguage":{"type":"string","title":"Applanguage","default":"en"},"projectsLimit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Projectslimit","description":"Maximum number of projects allowed"},"projectsCount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Projectscount","description":"Current number of projects"},"notificationsEnabled":{"type":"boolean","title":"Notificationsenabled","description":"Whether notifications are enabled","default":true},"preferences":{"anyOf":[{"$ref":"#/components/schemas/UserPreferences"},{"type":"null"}],"description":"User preferences (optional)"}},"type":"object","title":"UserProfileInDB"},"UserResponse":{"properties":{"providerId":{"$ref":"#/components/schemas/AUTH_PROVIDER","description":"Auth provider (firebase, google, apple)"},"uid":{"type":"string","title":"Uid","description":"Firebase user ID"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"User email address"},"emailVerified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Emailverified","description":"Indicates if the user's email is verified"},"displayName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Displayname","description":"User display name"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"User's name"},"familyName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Familyname","description":"User's last name"},"profilePhoto":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profilephoto","description":"Profile photo URL"},"avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar","description":"Avatar seed or string identifier"},"fcmToken":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fcmtoken","description":"FCM token for push notifications"},"phoneNumber":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phonenumber","description":"User's phone number"},"credits":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"number"}]},"type":"object"},{"type":"null"}],"title":"Credits","description":"User credits balance"},"settings":{"anyOf":[{},{"type":"null"}],"title":"Settings"},"privacy":{"anyOf":[{},{"type":"null"}],"title":"Privacy"},"notifications":{"anyOf":[{},{"type":"null"}],"title":"Notifications"},"verification":{"anyOf":[{},{"type":"null"}],"title":"Verification"},"gender":{"anyOf":[{"$ref":"#/components/schemas/Gender"},{"type":"null"}]},"subscriptions":{"items":{"$ref":"#/components/schemas/UserSubscriptionSchema"},"type":"array","title":"Subscriptions","description":"User's subscriptions"},"activeSubscriptions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Activesubscriptions","description":"List of active subscription product IDs (computed field, not stored in DB)"},"isPremium":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ispremium","description":"Indicates if the user has any active subscriptions (computed field, not stored in DB)"},"hasTriggeredSalesNotification":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Hastriggeredsalesnotification","description":"Whether the user has triggered a sales notification on first launch","default":false},"createdAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Createdat","description":"Timestamp when the user was created"},"updatedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updatedat","description":"Timestamp when the user was last updated"}},"type":"object","required":["providerId","uid"],"title":"UserResponse","description":"User information response schema."},"UserSubscriptionSchema":{"properties":{"isActive":{"type":"boolean","title":"Isactive"},"expiresAt":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expiresat"},"productId":{"type":"string","title":"Productid"},"transactionId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transactionid"},"createdAt":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"title":"Createdat"},"updatedAt":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updatedat"}},"type":"object","required":["isActive","productId"],"title":"UserSubscriptionSchema","description":"Schema for current and legacy user subscription objects in Firestore."},"UserUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Name","description":"User's first name"},"familyName":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Familyname","description":"User's last name"},"profilePhoto":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Profilephoto","description":"URL of the user's profile photo"},"avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar","description":"Avatar seed or string identifier"},"fcmToken":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fcmtoken","description":"FCM token for push notifications"},"gender":{"anyOf":[{"$ref":"#/components/schemas/Gender"},{"type":"null"}],"description":"User's gender"}},"type":"object","title":"UserUpdateRequest","description":"Request schema for updating user profile information."},"UserUpdateResponse":{"properties":{"message":{"type":"string","title":"Message","description":"Status message"}},"type":"object","required":["message"],"title":"UserUpdateResponse","description":"Response schema for user update operation.","example":{"message":"User profile updated successfully"}},"UserWrapperResponse":{"properties":{"user":{"$ref":"#/components/schemas/UserResponse"}},"type":"object","required":["user"],"title":"UserWrapperResponse","description":"Wrapper response containing user data.\n\nMaintains consistency with Flask API structure while leveraging\nFastAPI's automatic validation and documentation."},"VIDEO_STATUS":{"type":"string","enum":["PENDING","PLANNING","GENERATING","COMPLETED","FAILED"],"title":"VIDEO_STATUS"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VersionStatus":{"type":"string","enum":["current","published","draft"],"title":"VersionStatus"},"VideoDocument":{"properties":{"id":{"type":"string","title":"Id"},"projectId":{"type":"string","title":"Projectid"},"versionId":{"type":"string","title":"Versionid"},"status":{"$ref":"#/components/schemas/VIDEO_STATUS"},"prompt":{"type":"string","title":"Prompt"},"plan":{"anyOf":[{"$ref":"#/components/schemas/VideoPlanSchema"},{"type":"null"}]},"videoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Videourl"},"thumbnailUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnailurl"},"createdAt":{"type":"string","format":"date-time","title":"Createdat"},"updatedAt":{"type":"string","format":"date-time","title":"Updatedat"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"errorCode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Errorcode"}},"type":"object","required":["id","projectId","versionId","status","prompt","createdAt","updatedAt"],"title":"VideoDocument","description":"Firestore document structure for a video job."},"VideoGenerateRequest":{"properties":{"projectId":{"type":"string","title":"Projectid"},"versionId":{"type":"string","title":"Versionid"},"screenshotGroupId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screenshotgroupid","description":"The screenshot group to use as context for the video."},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt","description":"Optional specific user instruction/concept"},"guideImageUrls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Guideimageurls"},"aspectRatio":{"$ref":"#/components/schemas/AspectRatio","description":"Target orientation for the video","default":"9:16"}},"type":"object","required":["projectId","versionId"],"title":"VideoGenerateRequest","description":"Schema for the video generation API request."},"VideoGenerateResponse":{"properties":{"jobId":{"type":"string","title":"Jobid"},"status":{"type":"string","title":"Status"}},"type":"object","required":["jobId","status"],"title":"VideoGenerateResponse","description":"Response returned immediately to the client."},"VideoPlanSchema":{"properties":{"plan":{"type":"string","title":"Plan","description":"The creative concept and narrative plan for the video."},"steps":{"items":{"type":"string"},"type":"array","title":"Steps","description":"Step by step execution breakdown."},"prompt_for_veo":{"type":"string","title":"Prompt For Veo","description":"The highly detailed, visual prompt to be sent to the video generation AI."},"rationale":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rationale","description":"Reasoning behind the plan."}},"type":"object","required":["plan","prompt_for_veo"],"title":"VideoPlanSchema","description":"Schema for the video generation plan structure output by the LLM."}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}},"servers":[{"url":"/mockupper"}]}