{"openapi":"3.1.0","info":{"title":"ImageLevate","description":"AI-powered product image enhancement for e-commerce sellers","version":"1.0.0"},"paths":{"/api/upload":{"post":{"tags":["upload"],"summary":"Upload Images","description":"Upload one or more product images.\n\nReturns a job_id and list of uploaded filenames.\nThe job_id is used in subsequent /process and /download calls.","operationId":"upload_images_api_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_images_api_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/process":{"post":{"tags":["process"],"summary":"Process Images","description":"Start processing uploaded images.\nProcessing runs in a background thread. Poll /api/status/{job_id} for progress.","operationId":"process_images_api_process_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/status/{job_id}":{"get":{"tags":["process"],"summary":"Get Status","description":"Get processing status for a job.","operationId":"get_status_api_status__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/regen-color-bg/{job_id}":{"post":{"tags":["process"],"summary":"Regen Color Bg","description":"Re-generate studio shot with a new base color tone.","operationId":"regen_color_bg_api_regen_color_bg__job_id__post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegenColorBgRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/regen-lifestyle/{job_id}":{"post":{"tags":["process"],"summary":"Regen Lifestyle","description":"Re-generate a single lifestyle image with an edited prompt.","operationId":"regen_lifestyle_api_regen_lifestyle__job_id__post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegenLifestyleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reset-usage":{"post":{"tags":["process"],"summary":"Reset Usage","description":"Reset image usage for the current month. Requires admin key.","operationId":"reset_usage_api_reset_usage_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetUsageRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/download/{job_id}":{"get":{"tags":["download"],"summary":"Download All","description":"Download all processed images for a job as a ZIP archive.\nIncludes platform-specific exports organized in subdirectories.","operationId":"download_all_api_download__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/download/{job_id}/{platform}/{filename}":{"get":{"tags":["download"],"summary":"Download Platform Image","description":"Download a specific platform-exported image.","operationId":"download_platform_image_api_download__job_id___platform___filename__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"platform","in":"path","required":true,"schema":{"type":"string","title":"Platform"}},{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/preview/{job_id}/{path}":{"get":{"tags":["download"],"summary":"Preview Image","description":"Preview an image from the job directory.\nUsed by the results page for before/after comparison.","operationId":"preview_image_api_preview__job_id___path__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/{job_id}/cdn-urls":{"get":{"tags":["download"],"summary":"Get Job Cdn Urls","description":"Return all CDN URLs for images generated in a specific job.\n\nResponse shape:\n{\n  \"job_id\": \"...\",\n  \"images\": [\n    {\"filename\": \"...\", \"image_type\": \"enhanced|amazon|shopify|...\", \"url\": \"https://cdn...\"},\n    ...\n  ],\n  \"by_type\": {\n    \"enhanced\": [\"https://cdn...\"],\n    \"amazon\":   [\"https://cdn...\"],\n    ...\n  }\n}\n\nRequires login. Only returns URLs for images owned by the current user.","operationId":"get_job_cdn_urls_api_jobs__job_id__cdn_urls_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/adjust/{job_id}/preview":{"get":{"tags":["adjust"],"summary":"Adjust Preview","description":"Return the enhanced image with real-time adjustments applied.\nUsed for live preview while the user drags sliders.","operationId":"adjust_preview_api_adjust__job_id__preview_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"path","in":"query","required":true,"schema":{"type":"string","description":"Relative path to the image inside the job dir","title":"Path"},"description":"Relative path to the image inside the job dir"},{"name":"brightness","in":"query","required":false,"schema":{"type":"number","maximum":2.0,"minimum":0.2,"default":1.0,"title":"Brightness"}},{"name":"contrast","in":"query","required":false,"schema":{"type":"number","maximum":2.0,"minimum":0.2,"default":1.0,"title":"Contrast"}},{"name":"saturation","in":"query","required":false,"schema":{"type":"number","maximum":2.0,"minimum":0.0,"default":1.0,"title":"Saturation"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/adjust/{job_id}/save":{"post":{"tags":["adjust"],"summary":"Adjust Save","description":"Save the adjusted image, re-generating shadow if params changed,\nthen applying color adjustments. Overwrites the enhanced file.","operationId":"adjust_save_api_adjust__job_id__save_post","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdjustSaveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/signup":{"post":{"tags":["auth"],"summary":"Signup","description":"Create a new account with email + password.","operationId":"signup_auth_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"Login with email + password.","operationId":"login_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","description":"Logout — clear session.","operationId":"logout_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/test-login":{"get":{"tags":["auth"],"summary":"Test Login","description":"Quick login for test environment — creates or reuses a test account.\nOnly available when TEST_AUTH_BYPASS=1 is set in .env.","operationId":"test_login_auth_test_login_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/google":{"get":{"tags":["auth"],"summary":"Google Login","description":"Redirect to Google OAuth consent screen.","operationId":"google_login_auth_google_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/google/callback":{"get":{"tags":["auth"],"summary":"Google Callback","description":"Handle Google OAuth callback.","operationId":"google_callback_auth_google_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","title":"Code"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/me":{"get":{"tags":["auth"],"summary":"Get Me","description":"Get current user info + plan + usage.","operationId":"get_me_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/plans":{"get":{"tags":["auth"],"summary":"Get Plans","description":"Get available plans and pricing.","operationId":"get_plans_auth_plans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/verify-phone":{"post":{"tags":["auth"],"summary":"Verify Phone","description":"Save verified phone number after Firebase OTP verification.\n\nThe frontend verifies the OTP via Firebase client SDK,\nthen sends the verified phone + Firebase UID here.\nWe trust Firebase's verification — the user already proved\nthey own the number through the OTP flow.","operationId":"verify_phone_auth_verify_phone_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PhoneVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/change-password":{"post":{"tags":["auth"],"summary":"Change Password","description":"Change password for logged-in user.","operationId":"change_password_auth_change_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payment/create-subscription":{"post":{"tags":["payment"],"summary":"Create Razorpay Subscription","description":"Create a Razorpay subscription for monthly plan.","operationId":"create_razorpay_subscription_api_payment_create_subscription_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSubscriptionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payment/verify":{"post":{"tags":["payment"],"summary":"Verify Payment","description":"Verify Razorpay subscription payment signature and activate plan.","operationId":"verify_payment_api_payment_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifySubscriptionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payment/webhook":{"post":{"tags":["payment"],"summary":"Razorpay Webhook","description":"Razorpay webhook for subscription lifecycle events.","operationId":"razorpay_webhook_api_payment_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/payment/create-checkout":{"post":{"tags":["payment"],"summary":"Create Stripe Checkout","description":"Create a Stripe Checkout session for monthly subscription (USD).","operationId":"create_stripe_checkout_api_payment_create_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payment/stripe-success":{"get":{"tags":["payment"],"summary":"Stripe Success","description":"Handle Stripe redirect after successful subscription checkout.","operationId":"stripe_success_api_payment_stripe_success_get","parameters":[{"name":"session_id","in":"query","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payment/stripe-webhook":{"post":{"tags":["payment"],"summary":"Stripe Webhook","description":"Stripe webhook for subscription lifecycle events.","operationId":"stripe_webhook_api_payment_stripe_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/payment/cancel-subscription":{"post":{"tags":["payment"],"summary":"Cancel Subscription","description":"Cancel the user's active subscription (stops auto-renewal at period end).","operationId":"cancel_subscription_api_payment_cancel_subscription_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/payment/subscription-status":{"get":{"tags":["payment"],"summary":"Subscription Status","description":"Get the current user's subscription status.","operationId":"subscription_status_api_payment_subscription_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/payment/gateways":{"get":{"tags":["payment"],"summary":"Get Available Gateways","description":"Return which payment gateways are configured.","operationId":"get_available_gateways_api_payment_gateways_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/payment/create-payg-order":{"post":{"tags":["payment"],"summary":"Create Payg Order","description":"Create a Razorpay one-time order for PAYG credit pack.","operationId":"create_payg_order_api_payment_create_payg_order_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaygPurchaseRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payment/verify-payg":{"post":{"tags":["payment"],"summary":"Verify Payg","description":"Verify PAYG one-time payment and add credits.","operationId":"verify_payg_api_payment_verify_payg_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaygVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bg/health":{"get":{"tags":["background-removal"],"summary":"Bg Health Check","description":"Health check for background removal service.","operationId":"bg_health_check_api_bg_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/bg/platforms":{"get":{"tags":["background-removal"],"summary":"List Platforms","description":"List available platforms and their compliance specifications.","operationId":"list_platforms_api_bg_platforms_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/bg/remove-background":{"post":{"tags":["background-removal"],"summary":"Api Remove Background","description":"Remove background from an uploaded image.\nReturns PNG with transparent background.","operationId":"api_remove_background_api_bg_remove_background_post","parameters":[{"name":"enhance_color","in":"query","required":false,"schema":{"$ref":"#/components/schemas/EnhanceMode","description":"Color enhancement level: none, light, moderate, strong","default":"none"},"description":"Color enhancement level: none, light, moderate, strong"},{"name":"quality","in":"query","required":false,"schema":{"$ref":"#/components/schemas/QualityMode","description":"Model quality: fast (u2net), quality (isnet), best (birefnet + alpha matting)","default":"best"},"description":"Model quality: fast (u2net), quality (isnet), best (birefnet + alpha matting)"},{"name":"post_process_mask","in":"query","required":false,"schema":{"type":"boolean","description":"Whether to refine the mask edges","default":true,"title":"Post Process Mask"},"description":"Whether to refine the mask edges"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_api_remove_background_api_bg_remove_background_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"image/png":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bg/remove-background-white":{"post":{"tags":["background-removal"],"summary":"Api Remove Background White","description":"Remove background and place product on white background.\nIdeal for e-commerce listings requiring white BG compliance.","operationId":"api_remove_background_white_api_bg_remove_background_white_post","parameters":[{"name":"enhance_color","in":"query","required":false,"schema":{"$ref":"#/components/schemas/EnhanceMode","description":"Color enhancement level","default":"none"},"description":"Color enhancement level"},{"name":"quality","in":"query","required":false,"schema":{"$ref":"#/components/schemas/QualityMode","description":"Model quality: fast, quality, best","default":"best"},"description":"Model quality: fast, quality, best"},{"name":"output_width","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":10000,"minimum":100},{"type":"null"}],"description":"Output width in pixels","title":"Output Width"},"description":"Output width in pixels"},{"name":"output_height","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":10000,"minimum":100},{"type":"null"}],"description":"Output height in pixels","title":"Output Height"},"description":"Output height in pixels"},{"name":"padding_percent","in":"query","required":false,"schema":{"type":"number","maximum":30,"minimum":0,"description":"Padding around product as %% of image size (0-30)","default":5.0,"title":"Padding Percent"},"description":"Padding around product as %% of image size (0-30)"},{"name":"output_format","in":"query","required":false,"schema":{"type":"string","description":"Output format: jpeg or png","default":"jpeg","title":"Output Format"},"description":"Output format: jpeg or png"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_api_remove_background_white_api_bg_remove_background_white_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"image/jpeg":{},"image/png":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/bg/export-platform":{"post":{"tags":["background-removal"],"summary":"Api Export For Platform","description":"Full e-commerce pipeline: BG removal → support-structure removal → upscale → platform-compliant export.\n\nAutomatically handles:\n- Background removal (BiRefNet/ISNet/U2Net)\n- Support-structure removal (stools, stands below cushions/pillows)\n- Upscaling to meet minimum resolution (LANCZOS + UnsharpMask)\n- White background placement with correct padding\n- File size optimization (binary-search JPEG quality for strict limits)\n- Platform-specific output size (Amazon 2000x2000, Shopify 2048x2048, etc.)","operationId":"api_export_for_platform_api_bg_export_platform_post","parameters":[{"name":"platform","in":"query","required":false,"schema":{"$ref":"#/components/schemas/Platform","description":"Target e-commerce platform","default":"amazon"},"description":"Target e-commerce platform"},{"name":"product_category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Product category (e.g. 'cushion', 'pillow') for support-structure removal","title":"Product Category"},"description":"Product category (e.g. 'cushion', 'pillow') for support-structure removal"},{"name":"enhance_color","in":"query","required":false,"schema":{"$ref":"#/components/schemas/EnhanceMode","description":"Color enhancement level","default":"none"},"description":"Color enhancement level"},{"name":"quality","in":"query","required":false,"schema":{"$ref":"#/components/schemas/QualityMode","description":"Model quality: fast, quality, best","default":"best"},"description":"Model quality: fast, quality, best"},{"name":"padding_percent","in":"query","required":false,"schema":{"type":"number","maximum":30,"minimum":0,"description":"Padding around product as %% (0-30)","default":5.0,"title":"Padding Percent"},"description":"Padding around product as %% (0-30)"},{"name":"remove_support","in":"query","required":false,"schema":{"type":"boolean","description":"Remove support structures (stools/stands) below product","default":true,"title":"Remove Support"},"description":"Remove support structures (stools/stands) below product"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_api_export_for_platform_api_bg_export_platform_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"image/jpeg":{},"image/png":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/guest/process":{"post":{"tags":["guest-preview"],"summary":"Guest Process Preview","description":"One free guest preview: local BG removal + white background + watermark.","operationId":"guest_process_preview_api_guest_process_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_guest_process_preview_api_guest_process_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tools/image-score":{"post":{"tags":["tools"],"summary":"Score Image","operationId":"score_image_api_tools_image_score_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_score_image_api_tools_image_score_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/faq":{"get":{"tags":["faq"],"summary":"Faq Home","description":"FAQ landing page with search and category navigation.","operationId":"faq_home_faq_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":140,"default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/faq/{category_slug}":{"get":{"tags":["faq"],"summary":"Faq Category Page","description":"Category page with answer-first FAQ blocks.","operationId":"faq_category_page_faq__category_slug__get","parameters":[{"name":"category_slug","in":"path","required":true,"schema":{"type":"string","title":"Category Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/faq/search":{"get":{"tags":["faq"],"summary":"Faq Search Api","description":"Server-side FAQ search endpoint for help-center and assistant UX.","operationId":"faq_search_api_api_faq_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":140,"default":"","title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":30,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/assistant/query":{"post":{"tags":["assistant"],"summary":"Assistant Query","description":"Answer assistant queries from approved ImageLevate knowledge.","operationId":"assistant_query_api_assistant_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analytics/event":{"post":{"tags":["analytics"],"summary":"Analytics Event","description":"Collect compact analytics events for FAQ and assistant usage.","operationId":"analytics_event_api_analytics_event_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyticsEventRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/knowledge-demand":{"get":{"tags":["analytics"],"summary":"Admin Knowledge Demand","description":"Admin-only summary for FAQ demand discovery and gaps.","operationId":"admin_knowledge_demand_api_admin_knowledge_demand_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Dashboard","description":"Main dashboard page.","operationId":"dashboard__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/free-try":{"get":{"summary":"Free Try Page","description":"Public one-image free try page.","operationId":"free_try_page_free_try_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/image-score":{"get":{"summary":"Image Score Page","description":"Public marketplace image score checker page.","operationId":"image_score_page_image_score_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/results/{job_id}":{"get":{"summary":"Results Page","description":"Results page for a completed job.","operationId":"results_page_results__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/login":{"get":{"summary":"Login Page","description":"Login/signup page.","operationId":"login_page_login_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/account":{"get":{"summary":"Account Page","description":"User account / dashboard page.","operationId":"account_page_account_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/pricing":{"get":{"summary":"Pricing Page","description":"Pricing / plans page.","operationId":"pricing_page_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/about":{"get":{"summary":"About Page","description":"About page.","operationId":"about_page_about_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/contact":{"get":{"summary":"Contact Page","description":"Contact page.","operationId":"contact_page_contact_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/terms":{"get":{"summary":"Terms Page","description":"Terms of Service page.","operationId":"terms_page_terms_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/privacy":{"get":{"summary":"Privacy Page","description":"Privacy Policy page.","operationId":"privacy_page_privacy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/refund":{"get":{"summary":"Refund Page","description":"Refund & Cancellation Policy page.","operationId":"refund_page_refund_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/googleeea011f51998e50a.html":{"get":{"summary":"Google Site Verification","operationId":"google_site_verification_googleeea011f51998e50a_html_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin":{"get":{"summary":"Admin Page","description":"Admin dashboard — restricted to is_admin users.","operationId":"admin_page_admin_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/update-plan":{"post":{"summary":"Admin Update Plan","description":"Admin endpoint to update a user's plan and expiry.","operationId":"admin_update_plan_admin_update_plan_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/contact":{"post":{"summary":"Contact Submit","description":"Handle contact form submissions.","operationId":"contact_submit_api_contact_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/gallery":{"get":{"summary":"Get Gallery","description":"Get user's stored images from R2 CDN.","operationId":"get_gallery_api_gallery_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gallery/{image_id}":{"delete":{"summary":"Delete Gallery Image","description":"Delete a user's image from R2 and database.","operationId":"delete_gallery_image_api_gallery__image_id__delete","parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"string","title":"Image Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gallery/download/{image_id}":{"get":{"summary":"Download Gallery Image","description":"Download a user's image as an attachment (forces browser download).","operationId":"download_gallery_image_api_gallery_download__image_id__get","parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"string","title":"Image Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/health":{"get":{"summary":"Health","description":"API health check endpoint.","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/lifestyle-diagnostic":{"get":{"summary":"Lifestyle Diagnostic","description":"Admin endpoint: show DB vs R2 lifestyle image counts to diagnose gaps.","operationId":"lifestyle_diagnostic_api_admin_lifestyle_diagnostic_get","parameters":[{"name":"user_email","in":"query","required":false,"schema":{"type":"string","default":"","title":"User Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/storage":{"get":{"summary":"Storage Info","description":"Get current storage usage stats.","operationId":"storage_info_api_storage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/storage/cleanup":{"post":{"summary":"Trigger Cleanup","description":"Manually trigger storage cleanup.","operationId":"trigger_cleanup_api_storage_cleanup_post","parameters":[{"name":"max_age_hours","in":"query","required":false,"schema":{"type":"number","default":24.0,"title":"Max Age Hours"}},{"name":"max_total_gb","in":"query","required":false,"schema":{"type":"number","default":10.0,"title":"Max Total Gb"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/training/stats":{"get":{"summary":"Training Stats","description":"Get training dataset statistics.","operationId":"training_stats_api_training_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/training/requirements":{"get":{"summary":"Training Requirements","description":"Check if training requirements are met.","operationId":"training_requirements_api_training_requirements_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/training/config":{"get":{"summary":"Training Config","description":"Get recommended training configuration.","operationId":"training_config_api_training_config_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string","title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AdjustSaveRequest":{"properties":{"path":{"type":"string","title":"Path"},"no_bg_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"No Bg Path"},"brightness":{"type":"number","title":"Brightness","default":1.0},"contrast":{"type":"number","title":"Contrast","default":1.0},"saturation":{"type":"number","title":"Saturation","default":1.0},"shadow_opacity":{"type":"number","title":"Shadow Opacity","default":0.3},"shadow_blur":{"type":"integer","title":"Shadow Blur","default":20},"shadow_offset_x":{"type":"integer","title":"Shadow Offset X","default":8},"shadow_offset_y":{"type":"integer","title":"Shadow Offset Y","default":14}},"type":"object","required":["path"],"title":"AdjustSaveRequest"},"AnalyticsEventRequest":{"properties":{"event":{"type":"string","title":"Event"},"page_path":{"type":"string","title":"Page Path","default":""},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"}},"type":"object","required":["event"],"title":"AnalyticsEventRequest"},"AssistantRequest":{"properties":{"message":{"type":"string","title":"Message"},"conversation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversation Id"},"page_path":{"type":"string","title":"Page Path","default":""}},"type":"object","required":["message"],"title":"AssistantRequest"},"Body_api_export_for_platform_api_bg_export_platform_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"Image file (JPEG, PNG, WebP)"}},"type":"object","required":["file"],"title":"Body_api_export_for_platform_api_bg_export_platform_post"},"Body_api_remove_background_api_bg_remove_background_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"Image file (JPEG, PNG, WebP)"}},"type":"object","required":["file"],"title":"Body_api_remove_background_api_bg_remove_background_post"},"Body_api_remove_background_white_api_bg_remove_background_white_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"Image file (JPEG, PNG, WebP)"}},"type":"object","required":["file"],"title":"Body_api_remove_background_white_api_bg_remove_background_white_post"},"Body_guest_process_preview_api_guest_process_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_guest_process_preview_api_guest_process_post"},"Body_score_image_api_tools_image_score_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_score_image_api_tools_image_score_post"},"Body_upload_images_api_upload_post":{"properties":{"files":{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"Body_upload_images_api_upload_post"},"ChangePasswordRequest":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"ChangePasswordRequest"},"CreateCheckoutRequest":{"properties":{"plan":{"type":"string","title":"Plan"}},"type":"object","required":["plan"],"title":"CreateCheckoutRequest"},"CreateSubscriptionRequest":{"properties":{"plan":{"type":"string","title":"Plan"}},"type":"object","required":["plan"],"title":"CreateSubscriptionRequest"},"EnhanceMode":{"type":"string","enum":["none","light","moderate","strong"],"title":"EnhanceMode"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LoginRequest":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"PaygPurchaseRequest":{"properties":{"pack":{"type":"string","title":"Pack"}},"type":"object","required":["pack"],"title":"PaygPurchaseRequest"},"PaygVerifyRequest":{"properties":{"razorpay_order_id":{"type":"string","title":"Razorpay Order Id"},"razorpay_payment_id":{"type":"string","title":"Razorpay Payment Id"},"razorpay_signature":{"type":"string","title":"Razorpay Signature"}},"type":"object","required":["razorpay_order_id","razorpay_payment_id","razorpay_signature"],"title":"PaygVerifyRequest"},"PerImageDim":{"properties":{"filename":{"type":"string","title":"Filename","default":""},"width":{"type":"string","title":"Width","default":""},"height":{"type":"string","title":"Height","default":""},"depth":{"type":"string","title":"Depth","default":""}},"type":"object","title":"PerImageDim","description":"Per-image dimension override."},"PerImageMaterial":{"properties":{"filename":{"type":"string","title":"Filename","default":""},"description":{"type":"string","title":"Description","default":""},"material":{"type":"string","title":"Material","default":""},"weight":{"type":"string","title":"Weight","default":""},"care_instructions":{"type":"string","title":"Care Instructions","default":""},"origin":{"type":"string","title":"Origin","default":""}},"type":"object","title":"PerImageMaterial","description":"Per-image material spec override."},"PhoneVerifyRequest":{"properties":{"phone":{"type":"string","title":"Phone"},"firebase_uid":{"type":"string","title":"Firebase Uid"}},"type":"object","required":["phone","firebase_uid"],"title":"PhoneVerifyRequest"},"Platform":{"type":"string","enum":["amazon","shopify","ebay","etsy","walmart","kohls","flipkart","custom"],"title":"Platform"},"ProcessRequest":{"properties":{"job_id":{"type":"string","title":"Job Id"},"enhance":{"type":"boolean","title":"Enhance","default":true},"upscale":{"type":"boolean","title":"Upscale","default":false},"color_correct":{"type":"boolean","title":"Color Correct","default":true},"sharpen":{"type":"boolean","title":"Sharpen","default":true},"remove_bg":{"type":"boolean","title":"Remove Bg","default":true},"add_shadow":{"type":"boolean","title":"Add Shadow","default":true},"shadow_type":{"type":"string","title":"Shadow Type","default":"drop"},"white_bg":{"type":"boolean","title":"White Bg","default":true},"bg_color":{"type":"string","title":"Bg Color","default":"#FFFFFF"},"ai_naming":{"type":"boolean","title":"Ai Naming","default":true},"generate_studio":{"type":"boolean","title":"Generate Studio","default":true},"platforms":{"items":{"type":"string"},"type":"array","title":"Platforms","default":[]},"brightness":{"type":"number","title":"Brightness","default":1.0},"contrast":{"type":"number","title":"Contrast","default":1.0},"saturation":{"type":"number","title":"Saturation","default":1.0},"sharpen_strength":{"type":"number","title":"Sharpen Strength","default":1.0},"denoise":{"type":"boolean","title":"Denoise","default":false},"fill_percent":{"type":"number","title":"Fill Percent","default":0.85},"add_dimensions":{"type":"boolean","title":"Add Dimensions","default":false},"dim_width":{"type":"string","title":"Dim Width","default":""},"dim_height":{"type":"string","title":"Dim Height","default":""},"dim_depth":{"type":"string","title":"Dim Depth","default":""},"per_image_dims":{"items":{"$ref":"#/components/schemas/PerImageDim"},"type":"array","title":"Per Image Dims","default":[]},"generate_lifestyle":{"type":"boolean","title":"Generate Lifestyle","default":false},"generate_angles":{"type":"boolean","title":"Generate Angles","default":false},"num_lifestyle":{"type":"integer","title":"Num Lifestyle","default":2},"angle_views":{"items":{"type":"string"},"type":"array","title":"Angle Views","default":[]},"lifestyle_scene":{"type":"string","title":"Lifestyle Scene","default":"auto"},"custom_scene_prompt":{"type":"string","title":"Custom Scene Prompt","default":""},"custom_lifestyle_prompt":{"type":"string","title":"Custom Lifestyle Prompt","default":""},"lifestyle_model":{"type":"string","title":"Lifestyle Model","default":"auto"},"add_watermark":{"type":"boolean","title":"Add Watermark","default":false},"watermark_text":{"type":"string","title":"Watermark Text","default":""},"watermark_position":{"type":"string","title":"Watermark Position","default":"bottom_right"},"watermark_opacity":{"type":"integer","title":"Watermark Opacity","default":80},"watermark_tiled":{"type":"boolean","title":"Watermark Tiled","default":false},"cloud_gpu_url":{"type":"string","title":"Cloud Gpu Url","default":""},"virtual_tryon":{"type":"boolean","title":"Virtual Tryon","default":false},"material_card":{"type":"boolean","title":"Material Card","default":false},"material_text":{"type":"string","title":"Material Text","default":""},"material_weight":{"type":"string","title":"Material Weight","default":""},"care_instructions":{"type":"string","title":"Care Instructions","default":""},"material_origin":{"type":"string","title":"Material Origin","default":""},"material_desc":{"type":"string","title":"Material Desc","default":""},"per_image_materials":{"items":{"$ref":"#/components/schemas/PerImageMaterial"},"type":"array","title":"Per Image Materials","default":[]}},"type":"object","required":["job_id"],"title":"ProcessRequest","description":"Processing request from the web UI."},"QualityMode":{"type":"string","enum":["fast","quality","best"],"title":"QualityMode"},"RegenColorBgRequest":{"properties":{"image_index":{"type":"integer","title":"Image Index","default":0},"bg_color":{"type":"string","title":"Bg Color","default":"#7C2A00"}},"type":"object","title":"RegenColorBgRequest"},"RegenLifestyleRequest":{"properties":{"image_index":{"type":"integer","title":"Image Index","default":0},"lifestyle_index":{"type":"integer","title":"Lifestyle Index","default":0},"prompt":{"type":"string","title":"Prompt"}},"type":"object","required":["prompt"],"title":"RegenLifestyleRequest"},"ResetUsageRequest":{"properties":{"admin_key":{"type":"string","title":"Admin Key"},"user_email":{"type":"string","title":"User Email","default":""}},"type":"object","required":["admin_key"],"title":"ResetUsageRequest"},"SignupRequest":{"properties":{"email":{"type":"string","title":"Email"},"name":{"type":"string","title":"Name","default":""},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"SignupRequest"},"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"},"VerifySubscriptionRequest":{"properties":{"razorpay_subscription_id":{"type":"string","title":"Razorpay Subscription Id"},"razorpay_payment_id":{"type":"string","title":"Razorpay Payment Id"},"razorpay_signature":{"type":"string","title":"Razorpay Signature"}},"type":"object","required":["razorpay_subscription_id","razorpay_payment_id","razorpay_signature"],"title":"VerifySubscriptionRequest"}}}}