{"openapi":"3.1.0","info":{"title":"Product Aggregator & Review System","description":"Search products across multiple marketplaces and aggregate reviews","version":"1.0.0"},"paths":{"/api/v1/auth/signup":{"post":{"tags":["authentication"],"summary":"Sign Up","description":"Register a new user with email and password.\n\n- **email**: User email address (must be unique)\n- **password**: Password (min 8 chars, 1 uppercase, 1 digit)\n- **full_name**: User's full name\n- **x_session_id**: (Header, optional) Guest session ID to migrate to new account\n\nReturns:\n- User profile with token information","operationId":"sign_up_api_v1_auth_signup_post","parameters":[{"name":"x-session-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Session-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignUpRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/signin":{"post":{"tags":["authentication"],"summary":"Sign In","description":"Authenticate user with email and password.\n\n- **email**: User email address\n- **password**: User password\n- **x_session_id**: (Header, optional) Guest session ID to migrate to existing account\n\nReturns:\n- User profile with token information","operationId":"sign_in_api_v1_auth_signin_post","parameters":[{"name":"x-session-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Session-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignInRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/token":{"post":{"tags":["authentication"],"summary":"Issue Token","description":"RFC 6749 \"password\" grant token endpoint.\n\nSame credentials and account as /signin, but form-encoded\n(username/password/grant_type) and returning the bare token shape the\nspec expects — for Swagger UI's Authorize dialog, the\noauth2_scheme(tokenUrl=...) dependency, and any standards-compliant\nOAuth2 client. /signin remains the JSON endpoint the web app itself uses.","operationId":"issue_token_api_v1_auth_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_issue_token_api_v1_auth_token_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/email-capture":{"post":{"tags":["authentication"],"summary":"Email Capture","description":"Capture a guest's email from the product-page nudge modal.\n\nCreates a lightweight passwordless account and logs the guest in\nimmediately — no password required — so the existing authenticated-vs-guest\ngating (full score card, higher search limits) unlocks automatically.\n\nIf the email already belongs to an existing account, we do NOT log the\nbrowser in as that account (typing an email proves nothing about who's\ntyping it); we just send the results email and tell the frontend to\npoint the visitor at login instead.\n\n- **email**: Guest's email address\n- **x_session_id**: (Header, optional) Guest session ID to migrate to the new account","operationId":"email_capture_api_v1_auth_email_capture_post","parameters":[{"name":"x-session-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Session-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailCaptureRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailCaptureResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/refresh":{"post":{"tags":["authentication"],"summary":"Refresh Token","description":"Refresh access token using refresh token.\n\n- **refresh_token**: Valid refresh token from previous authentication\n\nReturns:\n- New access and refresh tokens","operationId":"refresh_token_api_v1_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/me":{"get":{"tags":["authentication"],"summary":"Get Current User Info","description":"Get current authenticated user information.","operationId":"get_current_user_info_api_v1_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__auth__UserResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/auth/change-password":{"post":{"tags":["authentication"],"summary":"Change Password","description":"Change password for current user.\n\n- **current_password**: User's current password\n- **new_password**: New password (min 8 chars, 1 uppercase, 1 digit)\n\nReturns:\n- Success message","operationId":"change_password_api_v1_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"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/auth/logout":{"post":{"tags":["authentication"],"summary":"Logout","description":"Logout current user.\n\nNote: JWT tokens are stateless. To logout, client should discard the token.\nThis endpoint is for API consistency.\n\nReturns:\n- Success message","operationId":"logout_api_v1_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/auth/forgot-password":{"post":{"tags":["authentication"],"summary":"Forgot Password","description":"Request a password reset link.\n\n- **email**: User email address\n\nReturns:\n- Success message (doesn't reveal if email exists for security)","operationId":"forgot_password_api_v1_auth_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/reset-password":{"post":{"tags":["authentication"],"summary":"Reset Password","description":"Reset password using a reset token.\n\n- **token**: Password reset token from email link\n- **new_password**: New password (min 8 chars, 1 uppercase, 1 digit)\n\nReturns:\n- Success message","operationId":"reset_password_api_v1_auth_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetConfirm"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/verify-reset-token":{"get":{"tags":["authentication"],"summary":"Verify Reset Token","description":"Verify if a password reset token is valid.\n\n- **token**: Password reset token\n\nReturns:\n- Valid: True/False\n- Email: User email if valid","operationId":"verify_reset_token_api_v1_auth_verify_reset_token_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/verify-activation-token":{"get":{"tags":["authentication"],"summary":"Verify Activation Token","description":"Verify if an account activation token is valid.\n\nReturns:\n- valid: True/False\n- email: User email if valid","operationId":"verify_activation_token_api_v1_auth_verify_activation_token_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/activate":{"post":{"tags":["authentication"],"summary":"Activate Account","description":"Activate a new account and set password using an activation token.\n\n- **token**: Activation token from the invitation email link\n- **new_password**: Password to set (min 8 chars, 1 uppercase, 1 digit)\n\nReturns:\n- Success message","operationId":"activate_account_api_v1_auth_activate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetConfirm"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/google/login":{"get":{"tags":["authentication"],"summary":"Google Login","description":"Get Google OAuth login URL.\n\nReturns:\n- URL to redirect user to for Google authentication","operationId":"google_login_api_v1_auth_google_login_get","parameters":[{"name":"ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/google/callback":{"post":{"tags":["authentication"],"summary":"Google Callback","description":"Handle Google OAuth callback.\n\nArgs:\n- code: Authorization code from Google\n\nReturns:\n- User profile with token information","operationId":"google_callback_api_v1_auth_google_callback_post","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/profile/me":{"get":{"tags":["profile"],"summary":"Get Profile","description":"Get current user profile.","operationId":"get_profile_api_v1_profile_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__auth__UserResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/profile/update":{"put":{"tags":["profile"],"summary":"Update Profile","description":"Update user profile information.","operationId":"update_profile_api_v1_profile_update_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"full_name","in":"query","required":false,"schema":{"type":"string","title":"Full Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__auth__UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/profile/notifications":{"put":{"tags":["profile"],"summary":"Update Notifications","description":"Update user notification preferences.","operationId":"update_notifications_api_v1_profile_notifications_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationSettingsUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__auth__UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/profile/upload-photo":{"post":{"tags":["profile"],"summary":"Upload Photo","description":"Upload user profile photo.","operationId":"upload_photo_api_v1_profile_upload_photo_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_photo_api_v1_profile_upload_photo_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/profile/change-password":{"post":{"tags":["profile"],"summary":"Change Password","description":"Change user password.","operationId":"change_password_api_v1_profile_change_password_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"current_password","in":"query","required":true,"schema":{"type":"string","title":"Current Password"}},{"name":"new_password","in":"query","required":true,"schema":{"type":"string","title":"New Password"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/profile/disconnect-oauth":{"post":{"tags":["profile"],"summary":"Disconnect Oauth","description":"Disconnect OAuth provider from account.","operationId":"disconnect_oauth_api_v1_profile_disconnect_oauth_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/profile/connect-oauth":{"post":{"tags":["profile"],"summary":"Connect Oauth","description":"Connect OAuth provider to existing account.","operationId":"connect_oauth_api_v1_profile_connect_oauth_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"provider","in":"query","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"provider_id","in":"query","required":true,"schema":{"type":"string","title":"Provider Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/profile/admin-check":{"get":{"tags":["profile"],"summary":"Check Admin Status","description":"Check if current user has admin role.","operationId":"check_admin_status_api_v1_profile_admin_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/dashboard/overview":{"get":{"tags":["dashboard"],"summary":"Get Dashboard Overview","description":"Get user dashboard savings overview.","operationId":"get_dashboard_overview_api_v1_dashboard_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavingsOverviewResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/dashboard/tracked-products":{"get":{"tags":["dashboard"],"summary":"Get Tracked Products","description":"Get user's tracked products.","operationId":"get_tracked_products_api_v1_dashboard_tracked_products_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TrackedProductResponse"},"type":"array","title":"Response Get Tracked Products Api V1 Dashboard Tracked Products Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["dashboard"],"summary":"Track Product","description":"Track a product for the current user.","operationId":"track_product_api_v1_dashboard_tracked_products_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackProductRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/dashboard/tracked-products/{product_id}":{"delete":{"tags":["dashboard"],"summary":"Untrack Product","description":"Untrack a product.","operationId":"untrack_product_api_v1_dashboard_tracked_products__product_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/activity":{"get":{"tags":["dashboard"],"summary":"Get Dashboard Activity","description":"Get user's dashboard activity.","operationId":"get_dashboard_activity_api_v1_dashboard_activity_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ActivityEventResponse"},"type":"array","title":"Response Get Dashboard Activity Api V1 Dashboard Activity Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["dashboard"],"summary":"Log Dashboard Activity","description":"Log a user activity event for the dashboard.","operationId":"log_dashboard_activity_api_v1_dashboard_activity_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogActivityRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/dashboard/referrals":{"get":{"tags":["dashboard"],"summary":"Get Referral Stats","description":"Get dashboard referral statistics.","operationId":"get_referral_stats_api_v1_dashboard_referrals_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardReferralStatsResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/dashboard/all":{"get":{"tags":["dashboard"],"summary":"Get Dashboard All","description":"Get all dashboard data in a single request.\n\nCombines overview, tracked products, activity, and referrals\ninto one response to reduce DB connection pressure.","operationId":"get_dashboard_all_api_v1_dashboard_all_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/payments/create-checkout-session":{"post":{"tags":["payments"],"summary":"Create Checkout Session","description":"Create a Stripe checkout session for trial or premium subscription.","operationId":"create_checkout_session_api_v1_payments_create_checkout_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCheckoutSessionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/payments/checkout-complete":{"post":{"tags":["payments"],"summary":"Checkout Complete","description":"Handle checkout completion.","operationId":"checkout_complete_api_v1_payments_checkout_complete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutCallbackRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/payments/subscription":{"get":{"tags":["payments"],"summary":"Get Subscription","description":"Get current user subscription details.","operationId":"get_subscription_api_v1_payments_subscription_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/payments/create-portal-session":{"post":{"tags":["payments"],"summary":"Create Portal Session","description":"Create a Stripe billing portal session.","operationId":"create_portal_session_api_v1_payments_create_portal_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePortalSessionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/payments/transactions":{"get":{"tags":["payments"],"summary":"Get Payment Transactions","description":"Get all payment transactions for the current user.","operationId":"get_payment_transactions_api_v1_payments_transactions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PaymentTransactionResponse"},"type":"array","title":"Response Get Payment Transactions Api V1 Payments Transactions Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/payments/transactions/{transaction_id}":{"get":{"tags":["payments"],"summary":"Get Payment Transaction","description":"Get a specific payment transaction by ID.","operationId":"get_payment_transaction_api_v1_payments_transactions__transaction_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"transaction_id","in":"path","required":true,"schema":{"type":"string","title":"Transaction Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentTransactionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payments/transaction-status":{"get":{"tags":["payments"],"summary":"Check Transaction Status","description":"Check real-time status of a payment transaction from Stripe.\n\nUseful for monitoring payment processing status.","operationId":"check_transaction_status_api_v1_payments_transaction_status_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"payment_intent_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Intent Id"}},{"name":"session_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"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/v1/payments/webhook":{"post":{"tags":["payments"],"summary":"Stripe Webhook","description":"Handle Stripe webhooks.","operationId":"stripe_webhook_api_v1_payments_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/price-alerts/create":{"post":{"tags":["price-alerts"],"summary":"Create Price Alert","description":"Create a price alert for a product.","operationId":"create_price_alert_api_v1_price_alerts_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePriceAlertRequest"}}},"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/price-alerts/list":{"get":{"tags":["price-alerts"],"summary":"List Price Alerts","description":"List price alerts for current user or email.","operationId":"list_price_alerts_api_v1_price_alerts_list_get","parameters":[{"name":"email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},{"name":"active_only","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Active Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/price-alerts/{alert_id}":{"get":{"tags":["price-alerts"],"summary":"Get Price Alert","description":"Get a specific price alert.","operationId":"get_price_alert_api_v1_price_alerts__alert_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"string","title":"Alert Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["price-alerts"],"summary":"Update Price Alert","description":"Update a price alert.","operationId":"update_price_alert_api_v1_price_alerts__alert_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"string","title":"Alert Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePriceAlertRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["price-alerts"],"summary":"Delete Price Alert","description":"Delete a price alert.","operationId":"delete_price_alert_api_v1_price_alerts__alert_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"alert_id","in":"path","required":true,"schema":{"type":"string","title":"Alert Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/price-alerts/claim-orphaned":{"post":{"tags":["price-alerts"],"summary":"Claim Orphaned Alerts","description":"Claim all orphaned price alerts (alerts created with user's email before login).","operationId":"claim_orphaned_alerts_api_v1_price_alerts_claim_orphaned_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/search":{"post":{"tags":["search"],"summary":"Search Products","description":"Search for products globally with geo-targeting.\n\n**Parameters:**\n- **keyword**: Search keyword (required, 2-200 characters)\n- **country**: Country for search results (default: \"United States\")\n- **city**: Optional city for narrower location targeting\n- **language**: Language code for search interface (default: \"en\")\n- **zipcode**: Legacy field, not used for SerpAPI geo-targeting\n- **x_session_id**: (Header) Session ID for guest tracking\n\n**Search Limits:**\n- Guest users (no account): 5 free searches total\n- Free registered users: 10 searches per day\n- Premium/Trial users: Unlimited searches\n\n**Error Codes:**\n- 400: Invalid search query\n- 403: Search limit exceeded\n- 500: Internal server error","operationId":"search_products_api_v1_search_post","parameters":[{"name":"x-session-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Session-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Bad Request"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Forbidden"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search/limits":{"get":{"tags":["search"],"summary":"Get Search Limits","description":"Get current search limits and remaining searches for the user.\n\n**Query Parameters:**\n- **x_session_id**: (Header) Session ID for guest tracking\n\nReturns information about:\n- Whether user has search access\n- Remaining searches (or None if unlimited)\n- Whether user has unlimited access\n- User type (premium, registered, guest)\n- Daily limit for their tier","operationId":"get_search_limits_api_v1_search_limits_get","parameters":[{"name":"x-session-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Session-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search/cancel-prewarm":{"post":{"tags":["search"],"summary":"Cancel Prewarm","description":"Cancel any running pre-warm task for this user/session.\nCalled when navigating away from search results.","operationId":"cancel_prewarm_api_v1_search_cancel_prewarm_post","parameters":[{"name":"x-session-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Session-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product/{product_id}":{"get":{"tags":["products"],"summary":"Get Product By Id","description":"Get product details by product UUID.\n\nFirst checks product_cache table (populated when users visit product detail pages),\nthen falls back to in-memory search cache.\n\n- **product_id**: Product UUID from search results","operationId":"get_product_by_id_api_v1_product__product_id__get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ProductResponse"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product/amazon/{asin}":{"get":{"tags":["products"],"summary":"Get Amazon Product Details","description":"Get detailed product information by ASIN.\n\nNOTE: Products are retrieved from Google Shopping search cache.\nThe search must be performed first to populate the cache.\n\nThis endpoint is for backward compatibility. New clients should:\n1. Call /search to populate cache\n2. Use product.id from search results to fetch details\n\n- **asin**: Amazon Standard Identification Number (for cache lookup)\n- **title**: Optional product title from search results  \n- **image**: Optional product image from search results\n- **zipcode**: Optional zipcode parameter (for future enrichment)","operationId":"get_amazon_product_details_api_v1_product_amazon__asin__get","parameters":[{"name":"asin","in":"path","required":true,"schema":{"type":"string","title":"Asin"}},{"name":"title","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},{"name":"image","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image"}},{"name":"zipcode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zipcode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ProductResponse"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product/intelligent/{asin}":{"get":{"tags":["products"],"summary":"Get Intelligent Product Analysis","description":"Get intelligent product analysis combining three layers:\n\nLAYER 1 - DATA (Amazon = Canonical Truth):\n  - Title, images, variants, specs, pricing, rating, reviews\n  - Source: Amazon API via Oxylabs RapidAPI\n\nLAYER 2 - ENRICHMENT (SerpAPI Optional, Non-blocking):\n  - External reviews from blogs, forums, Reddit\n  - Cross-store pricing comparisons\n  - Doesn't override Amazon data, only supplements\n\nLAYER 3 - INTELLIGENCE (Gemini Analysis):\n  - Synthesizes pros/cons from all sources\n  - Generates verdict_score (1-10)\n  - Identifies deal-breakers and target customers\n  - Never modifies raw data, only analyzes\n\nReturns single unified JSON with all three layers integrated.\nFrontend reads from predictable paths: .amazon_reviews, .external_reviews, .analysis\n\n- **asin**: Amazon Standard Identification Number\n- **title**: Optional product title from search results\n- **image**: Optional product image from search results\n- **zipcode**: Optional zipcode for location-based pricing (defaults to config DEFAULT_ZIPCODE)","operationId":"get_intelligent_product_analysis_api_v1_product_intelligent__asin__get","parameters":[{"name":"asin","in":"path","required":true,"schema":{"type":"string","title":"Asin"}},{"name":"title","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},{"name":"image","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image"}},{"name":"zipcode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zipcode"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AmazonProductAnalysis"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product/details":{"post":{"tags":["products"],"summary":"Get Product Details By Source","description":"Get product details by source and source_id.\n\n- **source**: Product source (e.g., \"amazon\", \"walmart\")\n- **source_id**: Source-specific product ID","operationId":"get_product_details_by_source_api_v1_product_details_post","parameters":[{"name":"source","in":"query","required":true,"schema":{"type":"string","title":"Source"}},{"name":"source_id","in":"query","required":true,"schema":{"type":"string","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ProductResponse"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Not Found"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Bad Request"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product/immersive/{product_id}":{"get":{"tags":["products"],"summary":"Get Immersive Product Details","description":"Get detailed product information using SerpAPI Immersive Product API.\nThis endpoint is used for non-Amazon products to get rich details.\n\n- **product_id**: UUID of the product from our database","operationId":"get_immersive_product_details_api_v1_product_immersive__product_id__get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product/enriched/{product_id}":{"post":{"tags":["products"],"summary":"Get Enriched Product Details","description":"Get enriched product details for non-Amazon products.\nUses the immersive_api_link from search results to fetch detailed data.\n\nFetches stores with pagination based on user type:\n- Guest users: 10 stores\n- Free registered users: 25 stores\n- Premium/Trial users: 100 stores\n\n- **product_id**: UUID of the product from our database\n- **request**: Request body containing immersive_api_link from SerpAPI","operationId":"get_enriched_product_details_api_v1_product_enriched__product_id__post","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrichedProductRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product/{product_id}/ai-verdict":{"post":{"tags":["products"],"summary":"Generate Ai Verdict","description":"Queue AI verdict generation as an async Celery task (non-blocking).\n\nThe verdict includes:\n- IMO Score (1-10)\n- Pros and cons analysis\n- Key insights from multiple sources\n- Recommendation for target audience\n\nFrontend should poll /api/v1/reviews/status/{task_id} to check progress.\n\nCRITICAL: This endpoint DOES NOT generate the verdict.\nIt queues a task and returns the task_id for polling.\n\nArgs:\n    product_id: Product UUID from database\n    request: AIVerdictRequest with:\n        - enriched_data: Full response from /product/enriched endpoint\n        - scrape_stores: Whether to scrape store pages for insights\n\nReturns:\n    { task_id: \"celery-task-id\", status: \"pending\" }","operationId":"generate_ai_verdict_api_v1_product__product_id__ai_verdict_post","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIVerdictRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Ai Verdict Api V1 Product  Product Id  Ai Verdict Post"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Bad Request"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product/{product_id}/smart-verdict":{"post":{"tags":["products"],"summary":"Generate Smart Verdict","description":"Two-tier AI verdict: quick verdict (SerpAPI only) + full verdict (all sources).\n\nFrontend receives a quick_verdict via SSE PROGRESS event within 3-5s,\nthen the full verdict (with Reddit, forums, YouTube) via SUCCESS in 10-20s.\nPoll /api/v1/reviews/stream/{task_id} for real-time updates.","operationId":"generate_smart_verdict_api_v1_product__product_id__smart_verdict_post","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIVerdictRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Smart Verdict Api V1 Product  Product Id  Smart Verdict Post"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Bad Request"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product/{product_id}/detailed-verdict":{"post":{"tags":["products"],"summary":"Generate Detailed Verdict","description":"Generate a detailed AI verdict using ALL collected reviews from every source.\n\nCalled by the frontend AFTER all review sources (community, store, Google Shopping,\ndiscussions) have finished loading. Runs the full intelligence pipeline (ABSA, fake\ndetection, defect extraction, temporal analysis, etc.) on the complete review set,\nthen generates a comprehensive Gemini verdict.\n\nPoll /api/v1/reviews/stream/{task_id} for real-time updates.","operationId":"generate_detailed_verdict_api_v1_product__product_id__detailed_verdict_post","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetailedVerdictRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Generate Detailed Verdict Api V1 Product  Product Id  Detailed Verdict Post"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Bad Request"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product/{product_id}/short-video-reviews":{"get":{"tags":["products"],"summary":"Get Short Video Reviews","description":"Get short-form video reviews for a product.\n\nFetches YouTube Shorts, TikTok videos, and Instagram Reels related to the product.\nResults are cached for 24 hours.\n\nNon-blocking: returns immediately, videos load in background if not cached.\n\n- **product_id**: Product identifier, used only as the cache key. Accepts\n  both UUIDs and upstream Google Shopping numeric ids.\n- **title**: Product title (required for video search)","operationId":"get_short_video_reviews_api_v1_product__product_id__short_video_reviews_get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}},{"name":"title","in":"query","required":true,"schema":{"type":"string","description":"Product title for video search","title":"Title"},"description":"Product title for video search"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShortVideoReviewsResponse"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/debug/cache":{"get":{"tags":["products"],"summary":"Debug Cache","description":"Debug endpoint to check cache contents.","operationId":"debug_cache_api_v1_debug_cache_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/debug/intelligence/{product_id}":{"get":{"tags":["products"],"summary":"Debug Intelligence","description":"Debug endpoint: returns the full L1/L2/L3 intelligence debug log\nfor the last AI verdict generated for a product.\n\nShows parameter-by-parameter detail for every pipeline step:\n  L1: Ingestion, Fake Detection, ABSA, Defect Extraction, Recency, Score Assembly, Review Integrity\n  L2: Cohort Bucketing, Sentiment Drift, Failure Curve, Defect Clustering, Recall Detection, Durability Index","operationId":"debug_intelligence_api_v1_debug_intelligence__product_id__get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/debug/intelligence/run":{"post":{"tags":["products"],"summary":"Debug Intelligence Run","description":"Debug endpoint: run the intelligence pipeline on raw review data\nand return the full debug log WITHOUT saving to DB.\n\nSend a product_name and optional reviews array.\nIf no reviews provided, returns empty pipeline debug output.","operationId":"debug_intelligence_run_api_v1_debug_intelligence_run_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_debug_intelligence_run_api_v1_debug_intelligence_run_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/v1/reviews/upload-video":{"post":{"tags":["products"],"summary":"Upload Video Review","description":"Upload a video review for a product.\n\n- **product_id**: Google Shopping product ID or source-specific ID\n- **product_title**: Product title (used for creating product record if needed)\n- **product_source**: Product source like \"google_shopping\", \"amazon\", \"walmart\" (default: google_shopping)\n- **title**: Review title\n- **description**: Review description\n- **rating**: Rating 1-5\n- **video_file**: MP4 or MOV file (max 50MB)\n\nReturns: Approval pending message with guidelines link","operationId":"upload_video_review_api_v1_reviews_upload_video_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_video_review_api_v1_reviews_upload_video_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadSuccessResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}}},"413":{"description":"Request Entity Too Large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/reviews/user-reviews/{product_id}":{"get":{"tags":["products"],"summary":"Get User Reviews For Product","description":"Get approved user video reviews for a product.\n\n- **product_id**: UUID of the product\n\nReturns: List of approved user video reviews","operationId":"get_user_reviews_for_product_api_v1_reviews_user_reviews__product_id__get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserVideoReviewResponse"},"title":"Response Get User Reviews For Product Api V1 Reviews User Reviews  Product Id  Get"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reviews/my-submissions":{"get":{"tags":["products"],"summary":"Get My Submitted Reviews","description":"Get all video reviews submitted by the current user (all statuses).\n\nReturns: List of user's video reviews with status info","operationId":"get_my_submitted_reviews_api_v1_reviews_my_submissions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UserVideoReviewResponse"},"type":"array","title":"Response Get My Submitted Reviews Api V1 Reviews My Submissions Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/products/{product_id}/like":{"post":{"tags":["products"],"summary":"Toggle Product Like","description":"Toggle like status for a product (add or remove like).\n\nRequest body (optional):\n{\n    \"title\": \"Product Title\",\n    \"image_url\": \"https://...\",\n    \"price\": 99.99,\n    \"currency\": \"USD\",\n    \"source\": \"amazon\",\n    \"source_id\": \"B123456\",\n    \"brand\": \"Brand Name\",\n    \"description\": \"Product description\"\n}\n\nReturns: {is_liked: bool, like_count: int}","operationId":"toggle_product_like_api_v1_products__product_id__like_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Product Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/products/{product_id}/like/status":{"get":{"tags":["products"],"summary":"Get Product Like Status","description":"Get like status for a product (whether current user liked it and total like count).\n\nReturns: {is_liked: bool, like_count: int}","operationId":"get_product_like_status_api_v1_products__product_id__like_status_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/products/likes":{"get":{"tags":["products"],"summary":"Get User Liked Products","description":"Get all products liked by current user (paginated).\n\nQuery Parameters:\n- limit: Number of products to return (default: 20, max: 100)\n- offset: Pagination offset (default: 0)\n\nReturns: {products: [Product], total: int, limit: int, offset: int}","operationId":"get_user_liked_products_api_v1_products_likes_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"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/v1/product/{product_id}/trust-analysis":{"post":{"tags":["products"],"summary":"Analyze Product Trust","description":"Analyze review trustworthiness using statistical + 4-signal fake detection.\n\nReturns results synchronously (~100ms) — no Celery task, no polling needed.\nUses velocity burst, sentiment mismatch, reviewer clustering, and TF-IDF\nlinguistic fingerprint detection combined with multi-factor statistical analysis.","operationId":"analyze_product_trust_api_v1_product__product_id__trust_analysis_post","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Review Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product-cache/status/{product_id}":{"get":{"tags":["product-cache"],"summary":"Check product cache status","description":"Check if product cache exists and what parts are populated.\n\nUse this endpoint to determine what data needs to be fetched vs. loaded from cache.\n\nReturns:\n    - exists: Whether any cache entry exists\n    - has_basic_info: Basic product info is cached\n    - has_ai_verdict: AI verdict is cached (expensive to generate)\n    - has_reviews: Reviews are cached\n    - has_trust_analysis: Trust analysis is cached (expensive to generate)\n    - Timestamps for each component\n    - cache_age_hours: How old the cache is","operationId":"get_cache_status_api_v1_product_cache_status__product_id__get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCacheStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product-cache/{product_id}":{"get":{"tags":["product-cache"],"summary":"Get cached product data","description":"Get full cached product data including AI verdict, reviews, and trust analysis.\n\nUse this to load the expensive AI-generated data instantly.\nFresh price/store data should still be fetched from SERP API.\n\nReturns 404 if no cache exists for this product.","operationId":"get_cached_product_api_v1_product_cache__product_id__get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCacheResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product-cache/{product_id}/ai-data":{"get":{"tags":["product-cache"],"summary":"Get only AI-generated cached data","description":"Get only the AI-generated cached data (verdict, reviews, trust analysis).\n\nThis is useful when frontend wants to:\n1. Use cached AI data (expensive to generate)\n2. But still refresh prices/stores from SERP API (~1 sec)\n\nReturns 404 if no AI data is cached.","operationId":"get_cached_ai_data_api_v1_product_cache__product_id__ai_data_get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product-cache/basic-info":{"post":{"tags":["product-cache"],"summary":"Create or update basic product info in cache","description":"Create or update product cache with basic info from SERP API.\n\nThis should be called when enriched data is first loaded from SERP API.\nUses upsert (INSERT ... ON CONFLICT UPDATE) for efficiency.","operationId":"save_basic_info_api_v1_product_cache_basic_info_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCacheCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCacheResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product-cache/{product_id}/ai-verdict":{"put":{"tags":["product-cache"],"summary":"Update AI verdict in cache","description":"Update AI verdict in product cache.\n\nThis should be called after AI verdict is generated.\nCache entry must already exist (created via /basic-info endpoint).","operationId":"update_ai_verdict_api_v1_product_cache__product_id__ai_verdict_put","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCacheUpdateAIVerdictRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product-cache/{product_id}/reviews":{"put":{"tags":["product-cache"],"summary":"Update reviews in cache","description":"Update reviews in product cache.\n\nThis should be called when all reviews are loaded (from all sources).\nCache entry must already exist (created via /basic-info endpoint).","operationId":"update_reviews_api_v1_product_cache__product_id__reviews_put","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCacheUpdateReviewsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product-cache/{product_id}/trust-analysis":{"put":{"tags":["product-cache"],"summary":"Update trust analysis in cache","description":"Update trust analysis in product cache.\n\nThis should be called after trust analysis is generated.\nCache entry must already exist (created via /basic-info endpoint).","operationId":"update_trust_analysis_api_v1_product_cache__product_id__trust_analysis_put","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCacheUpdateTrustAnalysisRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product-cache/batch":{"post":{"tags":["product-cache"],"summary":"Batch update product cache","description":"Batch update multiple parts of product cache at once.\n\nUseful when multiple components load simultaneously or on page unload.\nIf cache doesn't exist, basic_info is required to create it first.","operationId":"batch_update_cache_api_v1_product_cache_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCacheBatchUpdateRequest"}}},"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/product-cache/by-url":{"post":{"tags":["product-cache"],"summary":"Find product cache by IMO URL","description":"Find a product cache entry by its IMO URL (imo_url).\n\nThis is a fallback lookup method when product ID is not available.\nUseful when the cache was saved under a different product ID.\n\nRequest body:\n{\n    \"imo_url\": \"/product/sony-ps5-123\"  # The IMO product URL\n}\n\nReturns:\n    - product_id: The cached product ID for this URL\n    - exists: Whether cache was found","operationId":"find_cache_by_url_api_v1_product_cache_by_url_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"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/product/{product_id}/reviews":{"post":{"tags":["reviews"],"summary":"Fetch Product Reviews","description":"Fetch and aggregate product reviews from multiple sources.\n\n- **product_id**: UUID of the product\n- **sources**: List of sources (amazon, reddit, youtube, forum)\n- **force_refresh**: Force fetch fresh data (bypass cache)","operationId":"fetch_product_reviews_api_v1_product__product_id__reviews_post","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewsResponse"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/product/{product_id}/videos":{"post":{"tags":["reviews"],"summary":"Fetch Product Videos","description":"Fetch YouTube review videos for a product.\n\n- **product_id**: UUID of the product\n- **force_refresh**: Force fetch fresh data (bypass cache)\n- **min_views**: Minimum number of views for videos to include","operationId":"fetch_product_videos_api_v1_product__product_id__videos_post","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideosRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideosResponse"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reviews/community":{"post":{"tags":["reviews"],"summary":"Get Community Reviews Stateless","description":"Fetch and normalize community reviews from Reddit and forums (ASYNC - Celery Task).\n\nNo database dependency - stateless operation.\nUses SerpAPI for search and Gemini AI for normalization.\n\nReturns immediately with task_id for polling results.\n\nArchitecture:\n1. Dispatch async task to Celery worker\n2. Return task_id to client\n3. Client polls /reviews/community/status/{task_id} for results\n\nRequest body:\n{\n    \"product_name\": string (required),\n    \"brand\": string (optional)\n}\n\nResponse:\n{\n    \"success\": true,\n    \"task_id\": \"string - UUID of the async task\",\n    \"status\": \"PENDING|STARTED|SUCCESS|FAILURE\",\n    \"message\": \"Task has been queued for processing\"\n}","operationId":"get_community_reviews_stateless_api_v1_reviews_community_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"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/reviews/store":{"post":{"tags":["reviews"],"summary":"Get Store Reviews Stateless","description":"Fetch and normalize store reviews from retailer websites (ASYNC - Celery Task).\n\nNo database dependency - stateless operation.\nGenerically scrapes reviews and uses Gemini AI for normalization.\n\nReturns immediately with task_id for polling results.\n\nArchitecture:\n1. Dispatch async task to Celery worker\n2. Return task_id to client\n3. Client polls /reviews/store/status/{task_id} for results\n\nRequest body:\n{\n    \"product_name\": string,\n    \"store_urls\": string[] (required - at least 1 URL)\n}\n\nResponse:\n{\n    \"success\": true,\n    \"task_id\": \"string - UUID of the async task\",\n    \"status\": \"PENDING|STARTED|SUCCESS|FAILURE\",\n    \"message\": \"Task has been queued for processing\"\n}","operationId":"get_store_reviews_stateless_api_v1_reviews_store_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"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/reviews/google":{"post":{"tags":["reviews"],"summary":"Get Google Reviews Stateless","description":"Fetch and normalize Google Shopping reviews (ASYNC - Celery Task).\n\nNo database dependency - stateless operation.\nUses Playwright to scrape and Gemini AI for normalization.\n\nReturns immediately with task_id for polling results.\n\nArchitecture:\n1. Dispatch async task to Celery worker\n2. Return task_id to client\n3. Client polls /reviews/google/status/{task_id} for results\n\nRequest body:\n{\n    \"product_name\": string (required),\n    \"google_shopping_url\": string (required - full Google Shopping URL)\n}\n\nResponse:\n{\n    \"success\": true,\n    \"task_id\": \"string - UUID of the async task\",\n    \"status\": \"PENDING|STARTED|SUCCESS|FAILURE\",\n    \"message\": \"Task has been queued for processing\"\n}","operationId":"get_google_reviews_stateless_api_v1_reviews_google_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"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/reviews/status/{task_id}":{"get":{"tags":["reviews"],"summary":"Get Review Task Status","description":"Check the status of a review task and retrieve results if available.\n\nPath parameters:\n    task_id: The UUID of the task returned from the review endpoints\n\nResponse statuses:\n    PENDING: Task is waiting to be processed\n    STARTED: Task is currently processing\n    PROGRESS: Task is streaming partial results (meta contains intermediate data)\n    SUCCESS: Task completed, results are available\n    FAILURE: Task failed, check 'error' field\n    RETRY: Task is being retried","operationId":"get_review_task_status_api_v1_reviews_status__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reviews/community/status/{task_id}":{"get":{"tags":["reviews"],"summary":"Get Community Review Task Status","description":"Check status of community reviews task.","operationId":"get_community_review_task_status_api_v1_reviews_community_status__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reviews/store/status/{task_id}":{"get":{"tags":["reviews"],"summary":"Get Store Review Task Status","description":"Check status of store reviews task.","operationId":"get_store_review_task_status_api_v1_reviews_store_status__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reviews/google/status/{task_id}":{"get":{"tags":["reviews"],"summary":"Get Google Review Task Status","description":"Check status of Google Shopping reviews task.","operationId":"get_google_review_task_status_api_v1_reviews_google_status__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reviews/stream/{task_id}":{"get":{"tags":["reviews"],"summary":"Stream Task Status","description":"SSE endpoint: streams Celery task status until SUCCESS or FAILURE.\n\nFrontend connects with EventSource and receives events like:\n    data: {\"status\": \"PROGRESS\", \"state_meta\": {...}}\n    data: {\"status\": \"SUCCESS\", \"result\": {...}}\n\nReplaces polling for AI verdict and Google reviews.","operationId":"stream_task_status_api_v1_reviews_stream__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reviews/discussions":{"post":{"tags":["reviews"],"summary":"Get Discussions Forums","description":"Scrape discussions and forums from Google Shopping immersive product data.\n\nTakes the discussions_and_forums array from SerpAPI immersive product response\nand scrapes each forum thread to extract reviews/discussions.\n\nReturns immediately with task_id for polling results.\n\nRequest body:\n{\n    \"product_name\": string (required),\n    \"discussions_and_forums\": array (required) - from immersive_data.product_results.discussions_and_forums\n}\n\nResponse:\n{\n    \"success\": true,\n    \"task_id\": \"string - UUID of the async task\",\n    \"status\": \"PENDING\",\n    \"message\": \"Task has been queued for processing\"\n}","operationId":"get_discussions_forums_api_v1_reviews_discussions_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"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/reviews/youtube/summarize":{"post":{"tags":["reviews"],"summary":"Summarize Youtube Video","description":"Summarize a single YouTube video review using AI.\n\nFREE operation - Extracts transcripts using yt-dlp and summarizes with Gemini.\n\nReturns immediately with task_id for polling results.\n\nRequest body:\n{\n    \"video_url\": \"string - Full YouTube video URL (required)\",\n    \"product_context\": \"string - Optional product name for context\"\n}\n\nResponse:\n{\n    \"success\": true,\n    \"task_id\": \"string - UUID of the async task\",\n    \"status\": \"PENDING|STARTED|SUCCESS|FAILURE\",\n    \"message\": \"Task has been queued for processing\",\n    \"polling_endpoint\": \"/api/v1/reviews/youtube/status/{task_id}\"\n}","operationId":"summarize_youtube_video_api_v1_reviews_youtube_summarize_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"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/reviews/youtube/summarize-batch":{"post":{"tags":["reviews"],"summary":"Summarize Youtube Videos Batch","description":"Summarize multiple YouTube videos in batch.\n\nProcesses videos in parallel for efficient batch summarization.\n\nReturns immediately with task_id for polling results.\n\nRequest body:\n{\n    \"video_urls\": [\"url1\", \"url2\", ...],\n    \"product_context\": \"Optional product name\"\n}\n\nResponse:\n{\n    \"success\": true,\n    \"task_id\": \"UUID\",\n    \"status\": \"PENDING\",\n    \"polling_endpoint\": \"/api/v1/reviews/youtube/batch-status/{task_id}\",\n    \"videos_queued\": 5\n}","operationId":"summarize_youtube_videos_batch_api_v1_reviews_youtube_summarize_batch_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"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/reviews/youtube/status/{task_id}":{"get":{"tags":["reviews"],"summary":"Get Youtube Summary Task Status","description":"Check status of a YouTube video summarization task.\n\nReturns the progress and results when complete.","operationId":"get_youtube_summary_task_status_api_v1_reviews_youtube_status__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reviews/youtube/batch-status/{task_id}":{"get":{"tags":["reviews"],"summary":"Get Youtube Batch Task Status","description":"Check status of a YouTube batch summarization task.\n\nReturns the progress and batch results when complete.","operationId":"get_youtube_batch_task_status_api_v1_reviews_youtube_batch_status__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/utils/geolocation":{"get":{"tags":["utils"],"summary":"Get User Geolocation","description":"Get user's geolocation based on their IP address.\n\nSupports users worldwide. Uses ipinfo.io API to determine the user's location\nfrom their IP address. No user permission required.\n\nPostal Code Handling:\n- US Users: Returns standard 5-digit ZIP codes (e.g., \"60607\")\n- International Users: Converts postal codes to 5-char format (e.g., \"50000\" for India's \"500001\")\n\nReturns:\n    - zipcode: Location identifier (5-char format for universal use)\n    - city: City name\n    - state: State/region name  \n    - latitude/longitude: Coordinates (if available)\n    - source: Geolocation service used\n\nFalls back gracefully if service unavailable (returns 500 error for frontend to handle).","operationId":"get_user_geolocation_api_v1_utils_geolocation_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeolocationResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__routes__utils__ErrorResponse"}}}}}}},"/api/v1/utils/extract-search-query":{"post":{"tags":["utils"],"summary":"Extract Search Query","description":"Extract a search query from scraped page content using AI.\n\nThis endpoint takes the content from a web page and uses AI to intelligently\nidentify the main product or topic the user is looking for. It then generates\na redirect URL to IMO search with the extracted query.\n\nArgs:\n    content: Scraped text/HTML content from the page\n    url: Current page URL (for context)\n\nReturns:\n    - redirectUrl: URL to redirect user to IMO search\n    - query: The extracted search query used\n\nExample:\n    POST /api/v1/utils/extract-search-query\n    {\n        \"content\": \"Best gaming laptops 2024...\",\n        \"url\": \"https://example.com/gaming-laptops\"\n    }\n    \n    Response:\n    {\n        \"redirectUrl\": \"https://informedmarketopinions.com/search?q=gaming%20laptop\",\n        \"query\": \"gaming laptop\"\n    }","operationId":"extract_search_query_api_v1_utils_extract_search_query_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageContentRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRedirectResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__routes__utils__ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__routes__utils__ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sitemaps/sitemap-index.xml":{"get":{"tags":["seo","seo"],"summary":"Get Sitemap Index","description":"Sitemap index — Google entry point for all sub-sitemaps.","operationId":"get_sitemap_index_api_v1_sitemaps_sitemap_index_xml_get","responses":{"200":{"description":"Successful Response"}}}},"/api/v1/sitemaps/products.xml":{"get":{"tags":["seo","seo"],"summary":"Get Products Sitemap","description":"All products with AI verdicts — highest-value URLs.","operationId":"get_products_sitemap_api_v1_sitemaps_products_xml_get","responses":{"200":{"description":"Successful Response"}}}},"/api/v1/sitemaps/static.xml":{"get":{"tags":["seo","seo"],"summary":"Get Static Sitemap","description":"Static pages + category landing pages.","operationId":"get_static_sitemap_api_v1_sitemaps_static_xml_get","responses":{"200":{"description":"Successful Response"}}}},"/api/v1/sitemaps/blog.xml":{"get":{"tags":["seo","seo"],"summary":"Get Blog Sitemap","description":"All published blog posts.","operationId":"get_blog_sitemap_api_v1_sitemaps_blog_xml_get","responses":{"200":{"description":"Successful Response"}}}},"/api/v1/sitemap.xml":{"get":{"tags":["seo","seo"],"summary":"Get Sitemap","description":"Generate dynamic sitemap.xml for Google Search Console.\n\nReturns all products in the product cache that have been analyzed.\nSitemap includes:\n- Homepage and blog\n- All analyzed products with their cached data\n- Priority based on trust score\n- Last modified dates\n\nEndpoint: GET /api/v1/sitemap.xml","operationId":"get_sitemap_api_v1_sitemap_xml_get","responses":{"200":{"description":"Successful Response"}}}},"/api/v1/seo/recently-analyzed":{"get":{"tags":["seo","seo"],"summary":"Get Recently Analyzed Products","description":"Get recently analyzed products for homepage display.\n\nReturns the most recently updated products from product cache,\nuseful for a \"Recently Analyzed\" or \"Trending Reviews\" component.\n\nEndpoint: GET /api/v1/seo/recently-analyzed?limit=10\n\nResponse:\n{\n    \"products\": [\n        {\n            \"id\": \"uuid\",\n            \"product_id\": \"google_shopping_id\",\n            \"title\": \"Product Title\",\n            \"image_url\": \"...\",\n            \"price\": 99.99,\n            \"trust_score\": 85,\n            \"imo_url\": \"/product/...\",\n            \"updated_at\": \"2025-02-05T10:30:00\"\n        }\n    ],\n    \"total\": 10\n}","operationId":"get_recently_analyzed_products_api_v1_seo_recently_analyzed_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Recently Analyzed Products Api V1 Seo Recently Analyzed Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seo/trending-products":{"get":{"tags":["seo","seo"],"summary":"Get Trending Products","description":"Get trending/high-trust products for homepage display.\n\nReturns products with high trust scores and strong reviews,\nsorted by trust score (descending).\n\nEndpoint: GET /api/v1/seo/trending-products?limit=10&min_trust_score=70\n\nResponse:\n{\n    \"products\": [\n        {\n            \"id\": \"uuid\",\n            \"product_id\": \"google_shopping_id\",\n            \"title\": \"Product Title\",\n            \"image_url\": \"...\",\n            \"price\": 99.99,\n            \"trust_score\": 92,\n            \"reviews_count\": 345,\n            \"average_rating\": 4.5,\n            \"imo_url\": \"/product/...\",\n            \"imo_ai_score\": 8.5\n        }\n    ],\n    \"total\": 10\n}","operationId":"get_trending_products_api_v1_seo_trending_products_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}},{"name":"min_trust_score","in":"query","required":false,"schema":{"type":"integer","default":70,"title":"Min Trust Score"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Trending Products Api V1 Seo Trending Products Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chatbot/chat":{"post":{"tags":["chatbot"],"summary":"Chat With Product","description":"Chat with AI assistant about a product.\n\nUses Gemini AI to answer questions about the product based on:\n- Product details (title, description, price, rating)\n- AI verdict (pros, cons, summary)\n- Conversation history for context","operationId":"chat_with_product_api_v1_chatbot_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__routes__chatbot__ChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__routes__chatbot__ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chatbot/agent-chat":{"post":{"tags":["chatbot"],"summary":"Agent Chat","description":"Chat with a domain-specific AI agent via a Gemini function-calling loop.\n\nThe model has two tools — search_products and get_product_verdict — and\ndecides for itself when it has enough context to use them vs. when to\nask a clarifying question, instead of a scripted funnel walking fixed\nQ1-Q4 stages. See agentic_chat_service.py for the reasoning: the old\napproach was a chain of regex/keyword heuristics approximating a\njudgment call the model can just make directly, and kept drifting out\nof sync with itself (bare brand names miscounted as specific models,\nuse-case word lists differing between channels, cross-message\nconcatenation producing nonsense matches).\n\nDomain routing (which agent owns this conversation) stays deterministic\n— that's a different, legitimate use of keyword matching (you want\n\"golf\" to reliably route to ACE, not have an LLM guess wrong sometimes).","operationId":"agent_chat_api_v1_chatbot_agent_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chatbot/agents":{"get":{"tags":["chatbot"],"summary":"Get Available Agents","description":"Return list of available agent types with metadata.","operationId":"get_available_agents_api_v1_chatbot_agents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/contact/submit":{"post":{"tags":["contact"],"summary":"Submit Contact Form","description":"Submit a contact form message.\n\nArgs:\n    contact_data: Contact form data (name, email, subject, message)\n    db: Database session\n\nReturns:\n    ContactResponse: Confirmation with contact submission details\n\nRaises:\n    HTTPException: If validation fails or database error occurs\n\nExample:\n    POST /api/v1/contact/submit\n    {\n        \"name\": \"John Doe\",\n        \"email\": \"john@example.com\",\n        \"subject\": \"Bug Report\",\n        \"message\": \"I found a bug...\"\n    }","operationId":"submit_contact_form_api_v1_contact_submit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactResponse"}}}},"400":{"description":"Validation error"},"500":{"description":"Internal server error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/contact/submissions":{"get":{"tags":["contact"],"summary":"Get Contact Submissions","description":"Get all contact form submissions (admin only - can add authentication later).\n\nArgs:\n    db: Database session\n\nReturns:\n    list[ContactResponse]: List of all contact submissions\n\nNote: This endpoint should be protected with admin authentication in production","operationId":"get_contact_submissions_api_v1_contact_submissions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ContactResponse"},"type":"array","title":"Response Get Contact Submissions Api V1 Contact Submissions Get"}}}},"401":{"description":"Unauthorized"},"500":{"description":"Internal server error"}}}},"/api/v1/admin/stats":{"get":{"tags":["admin"],"summary":"Get Admin Stats","description":"Get admin dashboard statistics.","operationId":"get_admin_stats_api_v1_admin_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/users":{"get":{"tags":["admin"],"summary":"List Users","description":"List all users with optional filtering.","operationId":"list_users_api_v1_admin_users_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"subscription_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Tier"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/subscriptions":{"get":{"tags":["admin"],"summary":"List Subscriptions","description":"List all subscriptions.","operationId":"list_subscriptions_api_v1_admin_subscriptions_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/contacts":{"get":{"tags":["admin"],"summary":"List Contacts","description":"List all contact form submissions.","operationId":"list_contacts_api_v1_admin_contacts_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/products":{"get":{"tags":["admin"],"summary":"List Products","description":"List all products.","operationId":"list_products_api_v1_admin_products_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/reviews":{"get":{"tags":["admin"],"summary":"List Reviews","description":"List all reviews.","operationId":"list_reviews_api_v1_admin_reviews_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/errors":{"get":{"tags":["admin"],"summary":"List Errors","description":"List error logs.","operationId":"list_errors_api_v1_admin_errors_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/tasks":{"get":{"tags":["admin"],"summary":"List Background Tasks","description":"List background analysis tasks.","operationId":"list_background_tasks_api_v1_admin_tasks_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/payment-transactions":{"get":{"tags":["admin"],"summary":"List Payment Transactions","description":"List all payment transactions.","operationId":"list_payment_transactions_api_v1_admin_payment_transactions_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/search-usage":{"get":{"tags":["admin"],"summary":"List Daily Search Usage","description":"List daily search usage data with user details and proper aggregation.","operationId":"list_daily_search_usage_api_v1_admin_search_usage_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":1000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{user_id}/role":{"post":{"tags":["admin"],"summary":"Update User Role","description":"Update user role (admin, moderator, user).","operationId":"update_user_role_api_v1_admin_users__user_id__role_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"role","in":"query","required":true,"schema":{"type":"string","title":"Role"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{user_id}/subscription":{"post":{"tags":["admin"],"summary":"Update User Subscription","description":"Manually update user subscription (admin action).","operationId":"update_user_subscription_api_v1_admin_users__user_id__subscription_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"plan_type","in":"query","required":true,"schema":{"type":"string","title":"Plan Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/recent-activities":{"get":{"tags":["admin"],"summary":"Get Recent Activities","description":"Get recent user activities including transactions, subscriptions, and logins.","operationId":"get_recent_activities_api_v1_admin_recent_activities_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"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/v1/admin/crud/subscriptions":{"post":{"tags":["admin-crud"],"summary":"Create Subscription","description":"Create a new subscription.","operationId":"create_subscription_api_v1_admin_crud_subscriptions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/crud/subscriptions/{subscription_id}":{"put":{"tags":["admin-crud"],"summary":"Update Subscription","description":"Update subscription by ID.","operationId":"update_subscription_api_v1_admin_crud_subscriptions__subscription_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Subscription Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin-crud"],"summary":"Delete Subscription","description":"Delete subscription by ID.","operationId":"delete_subscription_api_v1_admin_crud_subscriptions__subscription_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Subscription Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["admin-crud"],"summary":"Get Subscription","description":"Get subscription by ID.","operationId":"get_subscription_api_v1_admin_crud_subscriptions__subscription_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Subscription Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/invite-beta-tester":{"post":{"tags":["admin"],"summary":"Invite Beta Tester","description":"Invite a user as a beta tester.\n\n- **email**: Email address of user to invite\n- **full_name**: Full name of invited user (optional)\n\nReturns:\n- Success message with temporary password","operationId":"invite_beta_tester_api_v1_admin_invite_beta_tester_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}},{"name":"full_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/whatsapp-sessions":{"get":{"tags":["admin"],"summary":"List Whatsapp Sessions","description":"List WhatsApp conversations grouped by session_id (one session = one\ncontinuous conversation, bounded by a reset or a stale-lock gap), most\nrecently active first.","operationId":"list_whatsapp_sessions_api_v1_admin_whatsapp_sessions_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/whatsapp-sessions/{session_id}/messages":{"get":{"tags":["admin"],"summary":"Get Whatsapp Session Messages","description":"Full message history for one WhatsApp session, oldest first.","operationId":"get_whatsapp_session_messages_api_v1_admin_whatsapp_sessions__session_id__messages_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/health/docker":{"get":{"tags":["health"],"summary":"Get Docker Health","description":"Get Docker container health status.","operationId":"get_docker_health_api_v1_admin_health_docker_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Docker Health Api V1 Admin Health Docker Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/health/celery":{"get":{"tags":["health"],"summary":"Get Celery Health","description":"Get Celery worker health status.","operationId":"get_celery_health_api_v1_admin_health_celery_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Celery Health Api V1 Admin Health Celery Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/health/celery/tasks":{"get":{"tags":["health"],"summary":"Get Celery Tasks","description":"Get Celery task status and recent tasks.","operationId":"get_celery_tasks_api_v1_admin_health_celery_tasks_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status_filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Filter"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Celery Tasks Api V1 Admin Health Celery Tasks Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/health/system":{"get":{"tags":["health"],"summary":"Get System Health","description":"Get system health information.","operationId":"get_system_health_api_v1_admin_health_system_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get System Health Api V1 Admin Health System Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/crud/users":{"post":{"tags":["admin-crud"],"summary":"Create User","description":"Create a new user (admin only).","operationId":"create_user_api_v1_admin_crud_users_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__routes__admin_crud__UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/crud/users/{user_id}":{"get":{"tags":["admin-crud"],"summary":"Get User","description":"Get user by ID.","operationId":"get_user_api_v1_admin_crud_users__user_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__routes__admin_crud__UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin-crud"],"summary":"Update User","description":"Update user by ID.","operationId":"update_user_api_v1_admin_crud_users__user_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__routes__admin_crud__UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin-crud"],"summary":"Delete User","description":"Delete user by ID.","operationId":"delete_user_api_v1_admin_crud_users__user_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/crud/transactions":{"post":{"tags":["admin-crud"],"summary":"Create Transaction","description":"Create a new transaction.","operationId":"create_transaction_api_v1_admin_crud_transactions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/crud/transactions/{transaction_id}":{"get":{"tags":["admin-crud"],"summary":"Get Transaction","description":"Get transaction by ID.","operationId":"get_transaction_api_v1_admin_crud_transactions__transaction_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"transaction_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Transaction Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin-crud"],"summary":"Update Transaction","description":"Update transaction by ID.","operationId":"update_transaction_api_v1_admin_crud_transactions__transaction_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"transaction_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Transaction Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin-crud"],"summary":"Delete Transaction","description":"Delete transaction by ID.","operationId":"delete_transaction_api_v1_admin_crud_transactions__transaction_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"transaction_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Transaction Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/email/templates":{"post":{"tags":["admin-email"],"summary":"Create Template","description":"Create a new email template.","operationId":"create_template_api_v1_admin_email_templates_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailTemplateCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailTemplateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["admin-email"],"summary":"List Templates","description":"List all email templates.","operationId":"list_templates_api_v1_admin_email_templates_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"active_only","in":"query","required":false,"schema":{"type":"boolean","description":"Filter to active templates only","default":false,"title":"Active Only"},"description":"Filter to active templates only"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EmailTemplateResponse"},"title":"Response List Templates Api V1 Admin Email Templates Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/email/templates/{template_id}":{"get":{"tags":["admin-email"],"summary":"Get Template","description":"Get a specific email template.","operationId":"get_template_api_v1_admin_email_templates__template_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Template Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailTemplateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["admin-email"],"summary":"Update Template","description":"Update an email template.","operationId":"update_template_api_v1_admin_email_templates__template_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Template Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailTemplateUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailTemplateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin-email"],"summary":"Delete Template","description":"Delete an email template.","operationId":"delete_template_api_v1_admin_email_templates__template_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Template Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/email/templates/name/{template_name}":{"get":{"tags":["admin-email"],"summary":"Get Template By Name","description":"Get a template by name.","operationId":"get_template_by_name_api_v1_admin_email_templates_name__template_name__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_name","in":"path","required":true,"schema":{"type":"string","title":"Template Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailTemplateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/email/send":{"post":{"tags":["admin-email"],"summary":"Send Email Endpoint","description":"Send an email (with or without template).","operationId":"send_email_endpoint_api_v1_admin_email_send_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendEmailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/email/send/test/{template_name}":{"post":{"tags":["admin-email"],"summary":"Send Test Email","description":"Send a test email using a template.","operationId":"send_test_email_api_v1_admin_email_send_test__template_name__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"template_name","in":"path","required":true,"schema":{"type":"string","title":"Template Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_send_test_email_api_v1_admin_email_send_test__template_name__post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendEmailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/config/sections":{"get":{"tags":["admin-config"],"summary":"Get Sections","description":"Get product page section visibility config. No auth required.","operationId":"get_sections_api_v1_admin_config_sections_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"tags":["admin-config"],"summary":"Update Sections","description":"Bulk update section config.","operationId":"update_sections_api_v1_admin_config_sections_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/config/sections/{section_key}":{"patch":{"tags":["admin-config"],"summary":"Toggle Section","description":"Toggle a single section on/off.","operationId":"toggle_section_api_v1_admin_config_sections__section_key__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"section_key","in":"path","required":true,"schema":{"type":"string","title":"Section Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SectionToggle"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/product-cache":{"get":{"tags":["admin-product-cache"],"summary":"List Product Cache","description":"Paginated list of cached products for the admin table.","operationId":"list_product_cache_api_v1_admin_product_cache_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Match against title or product_id","title":"Search"},"description":"Match against title or product_id"},{"name":"has_ai_verdict","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Ai Verdict"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/product-cache/{product_id}":{"get":{"tags":["admin-product-cache"],"summary":"Get Product Cache Detail","description":"Full cached row for one product — everything the pipeline has stored:\nverdict, score_breakdown (incl. data_quality), score_components,\nabsa_scores, review_integrity_*, deal_breakers, temporal intelligence.","operationId":"get_product_cache_detail_api_v1_admin_product_cache__product_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCacheResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin-product-cache"],"summary":"Delete Product Cache","description":"Permanently remove a product from the public catalog.\n\nDeleting the row is what makes the rest of the stack behave correctly for\nSEO: /sitemaps/products.xml is generated live from this table (see\napp/api/routes/seo.py), so the URL drops out of it immediately, and\nGET /api/v1/product-cache/{product_id} then 404s, which the b2c SSR\npath (apps/b2c/api/product/[slug].js via entry-server.tsx) already turns\ninto a real HTTP 404 for crawlers — not a 200 \"soft 404\".\n\ntracked_products/savings_events/dashboard_activities all FK to\nproduct_cache.id, but — despite what the SQLAlchemy models declare —\nnone of those constraints actually carry an ON DELETE rule in the\ndeployed schema (checked alembic/versions/001_initial_neon_schema.py;\nonly 009_add_cascade_delete.py's *_user_id_fkey constraints got CASCADE,\nnever these product_id ones). A plain delete here throws a\nForeignKeyViolation for any product a user has tracked, saved against,\nor has dashboard activity for, so those dependents are removed first,\nin the same transaction.","operationId":"delete_product_cache_api_v1_admin_product_cache__product_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feedback/reaction":{"post":{"tags":["feedback"],"summary":"Submit Reaction","description":"👍/👎 on a verdict. One reaction per (product, identity) — resubmitting\nupdates the existing row rather than piling up duplicates.","operationId":"submit_reaction_api_v1_feedback_reaction_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReactionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReactionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feedback/reaction/{product_id}":{"get":{"tags":["feedback"],"summary":"Get Reaction","description":"The calling identity's existing reaction on this product, if any —\nlets the UI restore button state on reload.","operationId":"get_reaction_api_v1_feedback_reaction__product_id__get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}},{"name":"session_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ReactionResponse"},{"type":"null"}],"title":"Response Get Reaction Api V1 Feedback Reaction  Product Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feedback/accuracy-report":{"post":{"tags":["feedback"],"summary":"Submit Accuracy Report","description":"\"Help us get it right\" — structured report that lands directly in the\naccuracy queue (status=\"open\") for triage against AC-1/AC-2.","operationId":"submit_accuracy_report_api_v1_feedback_accuracy_report_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccuracyReportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccuracyReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/babywise/prelaunch":{"post":{"tags":["babywise"],"summary":"Submit Babywise Prelaunch","description":"Submit a babywise prelaunch signup.\n\nArgs:\n    prelaunch_data: Prelaunch signup data (email, user_agent)\n    user_agent: User agent from request headers\n    db: Database session\n\nReturns:\n    BabywisePrelaunchResponse: Confirmation with prelaunch signup details\n\nRaises:\n    HTTPException: If validation fails or database error occurs\n\nExample:\n    POST /api/v1/babywise/prelaunch\n    {\n        \"email\": \"user@example.com\",\n        \"user_agent\": \"Mozilla/5.0...\"\n    }","operationId":"submit_babywise_prelaunch_api_v1_babywise_prelaunch_post","parameters":[{"name":"user-agent","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User-Agent"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BabywisePrelaunchCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BabywisePrelaunchResponse"}}}},"400":{"description":"Validation error"},"500":{"description":"Internal server error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/babywise/prelaunch/list":{"get":{"tags":["babywise"],"summary":"Get Babywise Prelaunch List","description":"Get list of babywise prelaunch signups (admin only).\n\nArgs:\n    skip: Number of items to skip for pagination\n    limit: Number of items to return\n    current_user: Current authenticated user\n    db: Database session\n\nReturns:\n    BabywisePrelaunchList: List of prelaunch signups with total count\n\nRaises:\n    HTTPException: If not authenticated or not admin","operationId":"get_babywise_prelaunch_list_api_v1_babywise_prelaunch_list_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of items to skip","default":0,"title":"Skip"},"description":"Number of items to skip"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"description":"Number of items to return","default":100,"title":"Limit"},"description":"Number of items to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BabywisePrelaunchList"}}}},"401":{"description":"Not authenticated"},"403":{"description":"Not authorized"},"500":{"description":"Internal server error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/babywise/prelaunch/stats":{"get":{"tags":["babywise"],"summary":"Get Babywise Prelaunch Stats","description":"Get statistics about babywise prelaunch signups (admin only).\n\nArgs:\n    current_user: Current authenticated user\n    db: Database session\n\nReturns:\n    dict: Statistics including total count\n\nRaises:\n    HTTPException: If not authenticated or not admin","operationId":"get_babywise_prelaunch_stats_api_v1_babywise_prelaunch_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"401":{"description":"Not authenticated"},"403":{"description":"Not authorized"},"500":{"description":"Internal server error"}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/blogs/":{"post":{"tags":["blogs"],"summary":"Create Blog","description":"Create a new blog post.","operationId":"create_blog_api_v1_blogs__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/blogs/{blog_slug}":{"get":{"tags":["blogs"],"summary":"Get Blog","description":"Get a blog post by slug (public).","operationId":"get_blog_api_v1_blogs__blog_slug__get","parameters":[{"name":"blog_slug","in":"path","required":true,"schema":{"type":"string","title":"Blog Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/blogs/admin/{blog_id}":{"get":{"tags":["blogs"],"summary":"Get Blog Admin","description":"Get full blog details for editing (admin only, includes content/tags/attachments).","operationId":"get_blog_admin_api_v1_blogs_admin__blog_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"blog_id","in":"path","required":true,"schema":{"type":"string","title":"Blog Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/blogs/admin/list/all":{"get":{"tags":["blogs"],"summary":"List Admin Blogs","description":"List all blogs for admin.","operationId":"list_admin_blogs_api_v1_blogs_admin_list_all_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Admin Blogs Api V1 Blogs Admin List All Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/blogs/public/list":{"get":{"tags":["blogs"],"summary":"List Published Blogs","description":"List published blogs.","operationId":"list_published_blogs_api_v1_blogs_public_list_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Published Blogs Api V1 Blogs Public List Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/blogs/{blog_id}":{"put":{"tags":["blogs"],"summary":"Update Blog","description":"Update a blog post.","operationId":"update_blog_api_v1_blogs__blog_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"blog_id","in":"path","required":true,"schema":{"type":"string","title":"Blog Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["blogs"],"summary":"Delete Blog","description":"Delete a blog post.","operationId":"delete_blog_api_v1_blogs__blog_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"blog_id","in":"path","required":true,"schema":{"type":"string","title":"Blog Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogDeleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/blogs/{blog_id}/upload":{"post":{"tags":["blogs"],"summary":"Upload Blog Attachment","description":"Upload an attachment for a blog post.","operationId":"upload_blog_attachment_api_v1_blogs__blog_id__upload_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"blog_id","in":"path","required":true,"schema":{"type":"string","title":"Blog Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_blog_attachment_api_v1_blogs__blog_id__upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/trending":{"get":{"tags":["trending"],"summary":"Get Trending Products","description":"Get current trending consumer electronics products discovered by VOLT.\n\nReturns products from product_cache where is_trending=True,\nordered by trending_score DESC.\n\n- **limit**: Number of products (default 20, max 50)\n- **week**: Optional specific week string (e.g., '2025-W10')","operationId":"get_trending_products_api_v1_trending_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Number of trending products to return","default":75,"title":"Limit"},"description":"Number of trending products to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of products to skip, for pagination","default":0,"title":"Offset"},"description":"Number of products to skip, for pagination"},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Specific week (e.g., '2025-W27'). Defaults to latest.","title":"Week"},"description":"Specific week (e.g., '2025-W27'). Defaults to latest."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/trending/refresh":{"post":{"tags":["trending"],"summary":"Trigger Trending Refresh","description":"Trigger a new VOLT trending products scan.\n\nDispatches the run_volt_trending_scan_task Celery task.\nReturns the task ID for polling.","operationId":"trigger_trending_refresh_api_v1_trending_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/trending/status/{task_id}":{"get":{"tags":["trending"],"summary":"Get Trending Scan Status","description":"Check the status of a VOLT trending scan task.\n\n- **task_id**: Celery task ID from /trending/refresh","operationId":"get_trending_scan_status_api_v1_trending_status__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/volt/trending":{"get":{"tags":["volt-trending"],"summary":"Get Volt Trending Products","description":"Get current trending electronics discovered by VOLT.\nReturns products from product_cache where source='VOLT',\nordered by trending_score DESC.","operationId":"get_volt_trending_products_api_v1_volt_trending_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":75,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Week"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/babywise/trending":{"get":{"tags":["babywise-trending"],"summary":"Get Babywise Trending Products","description":"Get current trending baby & toddler products discovered by BABYWISE.\nReturns products from product_cache where source='BABYWISE',\nordered by trending_score DESC.","operationId":"get_babywise_trending_products_api_v1_babywise_trending_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":75,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Week"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/babywise/trending/refresh":{"post":{"tags":["babywise-trending"],"summary":"Trigger Babywise Trending Refresh","description":"Trigger a new BABYWISE trending baby products scan.\nDispatches the run_babywise_trending_scan_task Celery task.","operationId":"trigger_babywise_trending_refresh_api_v1_babywise_trending_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/babywise/trending/status/{task_id}":{"get":{"tags":["babywise-trending"],"summary":"Get Babywise Scan Status","description":"Check the status of a BABYWISE trending scan task.","operationId":"get_babywise_scan_status_api_v1_babywise_trending_status__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/hearth/trending":{"get":{"tags":["hearth-trending"],"summary":"Get Hearth Trending Products","description":"Get current trending kitchen & home appliance products discovered by HEARTH.\nReturns products from product_cache where source='HEARTH',\nordered by trending_score DESC.","operationId":"get_hearth_trending_products_api_v1_hearth_trending_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":75,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Week"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/hearth/trending/refresh":{"post":{"tags":["hearth-trending"],"summary":"Trigger Hearth Trending Refresh","description":"Trigger a new HEARTH trending home appliance scan.\nDispatches the run_hearth_trending_scan_task Celery task.","operationId":"trigger_hearth_trending_refresh_api_v1_hearth_trending_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/hearth/trending/status/{task_id}":{"get":{"tags":["hearth-trending"],"summary":"Get Hearth Scan Status","description":"Check the status of a HEARTH trending scan task.","operationId":"get_hearth_scan_status_api_v1_hearth_trending_status__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/trail/trending":{"get":{"tags":["trail-trending"],"summary":"Get Trail Trending Products","description":"Get current trending outdoor gear products discovered by TRAIL.\nReturns products from product_cache where source='TRAIL',\nordered by trending_score DESC.","operationId":"get_trail_trending_products_api_v1_trail_trending_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":75,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Week"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/trail/trending/refresh":{"post":{"tags":["trail-trending"],"summary":"Trigger Trail Trending Refresh","description":"Trigger a new TRAIL trending outdoor gear scan.\nDispatches the run_trail_trending_scan_task Celery task.","operationId":"trigger_trail_trending_refresh_api_v1_trail_trending_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/trail/trending/status/{task_id}":{"get":{"tags":["trail-trending"],"summary":"Get Trail Scan Status","description":"Check the status of a TRAIL trending scan task.","operationId":"get_trail_scan_status_api_v1_trail_trending_status__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ace/trending":{"get":{"tags":["ace-trending"],"summary":"Get Ace Trending Products","description":"Get current trending sports equipment discovered by ACE.\nReturns products from product_cache where source='ACE',\nordered by trending_score DESC.","operationId":"get_ace_trending_products_api_v1_ace_trending_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":75,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Week"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ace/trending/refresh":{"post":{"tags":["ace-trending"],"summary":"Trigger Ace Trending Refresh","description":"Trigger a new ACE trending sports equipment scan.\nDispatches the run_ace_trending_scan_task Celery task.","operationId":"trigger_ace_trending_refresh_api_v1_ace_trending_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/ace/trending/status/{task_id}":{"get":{"tags":["ace-trending"],"summary":"Get Ace Scan Status","description":"Check the status of an ACE trending scan task.","operationId":"get_ace_scan_status_api_v1_ace_trending_status__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sommelier/trending":{"get":{"tags":["sommelier-trending"],"summary":"Get Sommelier Trending Products","description":"Get current trending wine & whiskey products discovered by SOMMELIER.\nReturns products from product_cache where source='SOMMELIER',\nordered by trending_score DESC.","operationId":"get_sommelier_trending_products_api_v1_sommelier_trending_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":75,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Week"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sommelier/trending/refresh":{"post":{"tags":["sommelier-trending"],"summary":"Trigger Sommelier Trending Refresh","description":"Trigger a new SOMMELIER trending wine & whiskey scan.\nDispatches the run_sommelier_trending_scan_task Celery task.","operationId":"trigger_sommelier_trending_refresh_api_v1_sommelier_trending_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/sommelier/trending/status/{task_id}":{"get":{"tags":["sommelier-trending"],"summary":"Get Sommelier Scan Status","description":"Check the status of a SOMMELIER trending scan task.","operationId":"get_sommelier_scan_status_api_v1_sommelier_trending_status__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/forge/trending":{"get":{"tags":["forge-trending"],"summary":"Get Forge Trending Products","description":"Return cached FORGE fitness products ordered by the latest score.","operationId":"get_forge_trending_products_api_v1_forge_trending_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":75,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"week","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Week"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/forge/trending/refresh":{"post":{"tags":["forge-trending"],"summary":"Trigger Forge Trending Refresh","description":"Queue a FORGE fitness-product scan.","operationId":"trigger_forge_trending_refresh_api_v1_forge_trending_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/forge/trending/status/{task_id}":{"get":{"tags":["forge-trending"],"summary":"Get Forge Scan Status","description":"Check the status of a FORGE scan task.","operationId":"get_forge_scan_status_api_v1_forge_trending_status__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/whatsapp/webhook":{"get":{"tags":["whatsapp"],"summary":"Whatsapp Webhook Verify","description":"Twilio webhook verification (GET) — some setups require this.\nSimply returns 200 OK.","operationId":"whatsapp_webhook_verify_api_v1_whatsapp_webhook_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["whatsapp"],"summary":"Whatsapp Webhook","description":"Twilio WhatsApp webhook — receives incoming messages.\n\nTwilio sends POST with form data:\n- From: \"whatsapp:+1234567890\"\n- Body: \"message text\"\n- To: \"whatsapp:+14155238886\" (your Twilio number)","operationId":"whatsapp_webhook_api_v1_whatsapp_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/whatsapp/send-scorecard/{product_id}":{"post":{"tags":["whatsapp"],"summary":"Send Scorecard","description":"Manually trigger sending a scorecard image to a WhatsApp number.\nUseful for testing or admin-triggered sends.\n\nBody: {\"phone\": \"whatsapp:+1234567890\"}","operationId":"send_scorecard_api_v1_whatsapp_send_scorecard__product_id__post","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/whatsapp/test-price-drop":{"post":{"tags":["whatsapp"],"summary":"Send Test Price Drop","description":"Test endpoint for WhatsApp Pro real-time price alerts.","operationId":"send_test_price_drop_api_v1_whatsapp_test_price_drop_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/whatsapp/test-recall":{"post":{"tags":["whatsapp"],"summary":"Send Test Recall","description":"Test endpoint for WhatsApp Pro real-time instant recall alerts (babywise).","operationId":"send_test_recall_api_v1_whatsapp_test_recall_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/share/badge/{user_id}.png":{"get":{"tags":["share"],"summary":"Get Savings Badge","description":"Generate and stream a 1080x1080 savings badge PNG for a given user.\nUses the Web Share / WhatsApp native sharing format.","operationId":"get_savings_badge_api_v1_share_badge__user_id__png_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/share/score/{product_id}.png":{"get":{"tags":["share"],"summary":"Get Score Card","description":"Generate and stream a 1080x1350 product score card PNG.","operationId":"get_score_card_api_v1_share_score__product_id__png_get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/subscription/activate-trial":{"post":{"tags":["trial"],"summary":"Activate Trial","description":"Return a Stripe Checkout URL for a subscription that includes a free trial.","operationId":"activate_trial_api_v1_subscription_activate_trial_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivateTrialRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/agent-profile/{agent_id}":{"get":{"tags":["agent-profile"],"summary":"Get Agent Profile","description":"Get the current user's preference profile for a specific agent.","operationId":"get_agent_profile_api_v1_agent_profile__agent_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["agent-profile"],"summary":"Update Agent Profile","description":"Manually update a user's agent profile (override preferences).","operationId":"update_agent_profile_api_v1_agent_profile__agent_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["agent-profile"],"summary":"Reset Agent Profile","description":"Reset (delete) a user's agent profile.","operationId":"reset_agent_profile_api_v1_agent_profile__agent_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent-profile":{"get":{"tags":["agent-profile"],"summary":"Get All Agent Profiles","description":"Get all agent profiles for the current user.","operationId":"get_all_agent_profiles_api_v1_agent_profile_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/AgentProfileResponse"},"type":"array","title":"Response Get All Agent Profiles Api V1 Agent Profile Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/agent-profile/{agent_id}/extract":{"post":{"tags":["agent-profile"],"summary":"Extract Preferences","description":"Extract preference signals from a conversation and update the profile.\n\nThis runs synchronously (< 3s via Gemini). For fire-and-forget\npost-session extraction, use the Celery task instead.","operationId":"extract_preferences_api_v1_agent_profile__agent_id__extract_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"agent_id","in":"path","required":true,"schema":{"type":"string","title":"Agent Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractPreferencesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionResultResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent-profile/rerank":{"post":{"tags":["agent-profile"],"summary":"Rerank Products","description":"Re-rank a list of products using the user's preference profile.","operationId":"rerank_products_api_v1_agent_profile_rerank_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RerankRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RerankResultResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/agent-logs/schedule":{"get":{"tags":["admin"],"summary":"Get Agent Schedule","description":"Get agent schedule configuration.","operationId":"get_agent_schedule_api_v1_admin_agent_logs_schedule_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/agent-logs/logs":{"get":{"tags":["admin"],"summary":"Get Agent Logs","description":"Get agent execution logs from the last N hours.","operationId":"get_agent_logs_api_v1_admin_agent_logs_logs_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","default":24,"title":"Hours"}},{"name":"agent","in":"query","required":false,"schema":{"type":"string","title":"Agent"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/agent-logs/logs/summary":{"get":{"tags":["admin"],"summary":"Get Agent Logs Summary","description":"Get summary of agent execution for the last N hours.","operationId":"get_agent_logs_summary_api_v1_admin_agent_logs_logs_summary_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"hours","in":"query","required":false,"schema":{"type":"integer","default":24,"title":"Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/agent-logs/running":{"get":{"tags":["admin"],"summary":"Get Running Agents","description":"List trending-scan runs currently in flight (STARTED, not yet completed).","operationId":"get_running_agents_api_v1_admin_agent_logs_running_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/agent-logs/trigger/{agent_name}":{"post":{"tags":["admin"],"summary":"Trigger Agent","description":"Manually dispatch a trending-scan agent's Celery task right now.","operationId":"trigger_agent_api_v1_admin_agent_logs_trigger__agent_name__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"agent_name","in":"path","required":true,"schema":{"type":"string","title":"Agent Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/agent-logs/stop/{task_id}":{"post":{"tags":["admin"],"summary":"Stop Agent Run","description":"Revoke a running (or queued) task and mark its log entry as stopped.","operationId":"stop_agent_run_api_v1_admin_agent_logs_stop__task_id__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/score-bank/import":{"post":{"tags":["admin-score-bank"],"summary":"Import Score Bank","description":"Upload the week's products.json (or CSV) for scoring.","operationId":"import_score_bank_api_v1_admin_score_bank_import_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_import_score_bank_api_v1_admin_score_bank_import_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/v1/admin/score-bank/{week}/run":{"post":{"tags":["admin-score-bank"],"summary":"Run Score Bank Week","description":"Dispatch scoring for every pending item in this week's batch.","operationId":"run_score_bank_week_api_v1_admin_score_bank__week__run_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"week","in":"path","required":true,"schema":{"type":"string","title":"Week"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/score-bank/{week}/items":{"get":{"tags":["admin-score-bank"],"summary":"Get Score Bank Items","description":"Poll current status of every item in this week's batch.","operationId":"get_score_bank_items_api_v1_admin_score_bank__week__items_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"week","in":"path","required":true,"schema":{"type":"string","title":"Week"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/score-bank/items/{item_id}/retry":{"post":{"tags":["admin-score-bank"],"summary":"Retry Score Bank Item","description":"Reset one item to pending and immediately dispatch scoring for it —\nfor correcting a single bad match without re-running the whole week.","operationId":"retry_score_bank_item_api_v1_admin_score_bank_items__item_id__retry_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/score-bank/items/{item_id}":{"delete":{"tags":["admin-score-bank"],"summary":"Delete Score Bank Item","description":"Remove one item from the week's batch (does not delete the linked\nproduct_cache row — that product stays live on the site).","operationId":"delete_score_bank_item_api_v1_admin_score_bank_items__item_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/score-bank/{week}/export":{"get":{"tags":["admin-score-bank"],"summary":"Export Score Bank Week","description":"Return the scores.json array for this week (download-ready).","operationId":"export_score_bank_week_api_v1_admin_score_bank__week__export_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"week","in":"path","required":true,"schema":{"type":"string","title":"Week"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/score":{"get":{"tags":["public-score"],"summary":"Get Product Score","description":"Look up the IMO score for a product by name.","operationId":"get_product_score_api_v1_score_get","parameters":[{"name":"product","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":200,"description":"Product name to look up","title":"Product"},"description":"Product name to look up"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/auth/invite/accept":{"post":{"tags":["b2b-auth"],"summary":"Accept Invite","description":"Accept an invitation, set a password, and receive tokens.","operationId":"accept_invite_api_v1_b2b_auth_invite_accept_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptInviteRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/B2BAuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/auth/login":{"post":{"tags":["b2b-auth"],"summary":"Login","description":"Authenticate a tenant user. Tenant is resolved from subdomain/header.\n\nWhen MFA is enrolled (``totp_enabled=True``) the route returns a short-lived\n``mfa_token`` instead of full tokens. The client must exchange this token by\nposting to ``/mfa/verify`` with a valid TOTP or backup code.","operationId":"login_api_v1_b2b_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/B2BLoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/B2BAuthResponse"},{"$ref":"#/components/schemas/B2BMFAChallengeResponse"}],"title":"Response Login Api V1 B2B Auth Login Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/auth/refresh":{"post":{"tags":["b2b-auth"],"summary":"Refresh Token","description":"Exchange a valid B2B refresh token for a new access/refresh pair.","operationId":"refresh_token_api_v1_b2b_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/B2BRefreshRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/B2BTokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/auth/me":{"get":{"tags":["b2b-auth"],"summary":"Me","description":"Return the current authenticated tenant user.","operationId":"me_api_v1_b2b_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/B2BUserResponse"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/auth/mfa/setup":{"post":{"tags":["b2b-mfa"],"summary":"Mfa Setup","description":"Begin TOTP enrolment. Returns the secret, QR code PNG, and backup codes (shown once).\n\nThe secret is stored encrypted but MFA is NOT enabled until the user calls\n``/mfa/confirm`` with a valid TOTP code.","operationId":"mfa_setup_api_v1_b2b_auth_mfa_setup_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MFASetupResponse"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/auth/mfa/confirm":{"post":{"tags":["b2b-mfa"],"summary":"Mfa Confirm","description":"Verify the first TOTP code from the authenticator app to activate MFA.","operationId":"mfa_confirm_api_v1_b2b_auth_mfa_confirm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MFAConfirmRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/auth/mfa/verify":{"post":{"tags":["b2b-mfa"],"summary":"Mfa Verify","description":"Exchange an MFA challenge token and a TOTP or backup code for full B2B tokens.\n\nAccepts either a 6-digit TOTP code or an ``XXXX-XXXX`` backup code.\nBackup codes are single-use and consumed on success.\nRate-limited to 5 attempts per 15 minutes.","operationId":"mfa_verify_api_v1_b2b_auth_mfa_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MFAVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/B2BAuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/auth/mfa/disable":{"post":{"tags":["b2b-mfa"],"summary":"Mfa Disable","description":"Disable TOTP MFA. Requires the user's password and a valid current TOTP code.","operationId":"mfa_disable_api_v1_b2b_auth_mfa_disable_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MFADisableRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/auth/mfa/backup-codes/regenerate":{"post":{"tags":["b2b-mfa"],"summary":"Mfa Regenerate Backup Codes","description":"Generate a fresh set of 10 backup codes. All previous codes are immediately invalidated.","operationId":"mfa_regenerate_backup_codes_api_v1_b2b_auth_mfa_backup_codes_regenerate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/settings/security":{"get":{"tags":["b2b-settings"],"summary":"Get Security Settings","description":"Return the tenant's current MFA policy (any authenticated user).","operationId":"get_security_settings_api_v1_b2b_settings_security_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantSecurityResponse"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]},"put":{"tags":["b2b-settings"],"summary":"Update Security Settings","description":"Update the tenant's MFA enforcement policy. Owner-only.","operationId":"update_security_settings_api_v1_b2b_settings_security_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantSecurityRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantSecurityResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/tenant":{"get":{"tags":["b2b-tenant"],"summary":"Get Current Tenant","description":"Return the caller's tenant.","operationId":"get_current_tenant_api_v1_b2b_tenant_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantResponse"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]},"patch":{"tags":["b2b-tenant"],"summary":"Update Current Tenant","description":"Update tenant settings. Owner only.","operationId":"update_current_tenant_api_v1_b2b_tenant_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/admin/tenants":{"post":{"tags":["b2b-tenant"],"summary":"Provision Tenant","description":"Super-admin: provision a new tenant and generate the owner invite.","operationId":"provision_tenant_api_v1_b2b_admin_tenants_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Token"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["b2b-tenant"],"summary":"List Tenants","description":"Super-admin: list every tenant with ingestion stats.","operationId":"list_tenants_api_v1_b2b_admin_tenants_get","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Token"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/tenants/{tenant_id}":{"patch":{"tags":["b2b-tenant"],"summary":"Admin Update Tenant","description":"Super-admin: update tenant fields.","operationId":"admin_update_tenant_api_v1_b2b_admin_tenants__tenant_id__patch","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Token"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTenantUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["b2b-tenant"],"summary":"Admin Delete Tenant","description":"Super-admin: delete a tenant and all its data.","operationId":"admin_delete_tenant_api_v1_b2b_admin_tenants__tenant_id__delete","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Token"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/tenants/{tenant_id}/users":{"get":{"tags":["b2b-tenant"],"summary":"Admin List Users","description":"Super-admin: list all users and pending invites for a tenant.","operationId":"admin_list_users_api_v1_b2b_admin_tenants__tenant_id__users_get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Token"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/tenants/{tenant_id}/users/{user_id}/role":{"patch":{"tags":["b2b-tenant"],"summary":"Admin Update Role","description":"Super-admin: change a user's role within a tenant.","operationId":"admin_update_role_api_v1_b2b_admin_tenants__tenant_id__users__user_id__role_patch","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Token"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/tenants/{tenant_id}/users/{user_id}":{"delete":{"tags":["b2b-tenant"],"summary":"Admin Remove User","description":"Super-admin: remove a user from a tenant.","operationId":"admin_remove_user_api_v1_b2b_admin_tenants__tenant_id__users__user_id__delete","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Token"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/send-email":{"post":{"tags":["b2b-tenant"],"summary":"Admin Send Email","description":"Super-admin: send a free-form email via Resend.","operationId":"admin_send_email_api_v1_b2b_admin_send_email_post","parameters":[{"name":"x-admin-token","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Token"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminEmailRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/admin/tenants/{tenant_id}/invite":{"post":{"tags":["b2b-tenant"],"summary":"Admin Invite User","description":"Super-admin: create an invite link for any tenant.","operationId":"admin_invite_user_api_v1_b2b_admin_tenants__tenant_id__invite_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"x-admin-token","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Token"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/users":{"get":{"tags":["b2b-users"],"summary":"List Users","description":"List all team members in the tenant.","operationId":"list_users_api_v1_b2b_users_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantUserListResponse"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/users/invite":{"post":{"tags":["b2b-users"],"summary":"Invite User","description":"Invite a teammate. Owner/admin only.","operationId":"invite_user_api_v1_b2b_users_invite_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteUserRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/users/{user_id}/role":{"patch":{"tags":["b2b-users"],"summary":"Update Role","description":"Change a user's role. Owner/admin only; only owners may assign owner.","operationId":"update_role_api_v1_b2b_users__user_id__role_patch","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRoleRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantUserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/users/{user_id}":{"delete":{"tags":["b2b-users"],"summary":"Remove User","description":"Remove (suspend) a team member. Owner/admin only.","operationId":"remove_user_api_v1_b2b_users__user_id__delete","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/products":{"get":{"tags":["b2b-products"],"summary":"List Products","description":"List the tenant's watched products with optional filters.","operationId":"list_products_api_v1_b2b_products_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"hero | competitor","title":"Role"},"description":"hero | competitor"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["b2b-products"],"summary":"Add Product","description":"Add a single product to the portfolio (upsert global + link tenant).","operationId":"add_product_api_v1_b2b_products_post","security":[{"B2BOAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__schemas__b2b__product__ProductResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/products/import":{"post":{"tags":["b2b-products"],"summary":"Import Products","description":"Bulk-import products from CSV (columns: name,url[,category,brand,price,internal_sku_id,role]).","operationId":"import_products_api_v1_b2b_products_import_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_import_products_api_v1_b2b_products_import_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductImportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/products/{product_id}/enrich":{"post":{"tags":["b2b-products"],"summary":"Trigger Enrich","description":"Manually re-queue enrichment for a pending or errored product.","operationId":"trigger_enrich_api_v1_b2b_products__product_id__enrich_post","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/products/{product_id}/normalize":{"post":{"tags":["b2b-products"],"summary":"Trigger Normalize","description":"Re-queue the LLM normalization step for a product that already has reviews.","operationId":"trigger_normalize_api_v1_b2b_products__product_id__normalize_post","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/products/{product_id}/score":{"post":{"tags":["b2b-products"],"summary":"Trigger Score","description":"Re-queue scoring only for a product that has already been normalized.","operationId":"trigger_score_api_v1_b2b_products__product_id__score_post","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["b2b-scores"],"summary":"Get Product Score","description":"Current score + defect breakdown for one product.","operationId":"get_product_score_api_v1_b2b_products__product_id__score_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SKUScoreResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/products/{product_id}/reviews/byod":{"post":{"tags":["b2b-products"],"summary":"Ingest Byod Reviews","description":"Ingest client-supplied reviews (BYOD) from a CSV or JSON file into reviews_raw.\n\nSupported formats:\n  CSV  — header row required; columns: review_text (required), rating, review_date,\n         verified, author_id, source_label\n  JSON — array of objects with the same keys; also accepts newline-delimited JSON (NDJSON)\n\nRows are de-duplicated via content_hash; existing identical reviews are skipped.\nAfter ingestion, trigger /normalize then /score to fold the new data into the score.","operationId":"ingest_byod_reviews_api_v1_b2b_products__product_id__reviews_byod_post","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_ingest_byod_reviews_api_v1_b2b_products__product_id__reviews_byod_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/products/{product_id}":{"delete":{"tags":["b2b-products"],"summary":"Remove Product","description":"Remove a product from the tenant's portfolio (unlink; global product stays).","operationId":"remove_product_api_v1_b2b_products__product_id__delete","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/portfolio":{"get":{"tags":["b2b-scores"],"summary":"Get Portfolio","description":"Portfolio dashboard: every watched product with its current score, by risk.","operationId":"get_portfolio_api_v1_b2b_portfolio_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"band","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"high_risk|medium_risk|low_risk|minimal_risk","title":"Band"},"description":"high_risk|medium_risk|low_risk|minimal_risk"},{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"hero | competitor","title":"Role"},"description":"hero | competitor"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortfolioResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/pipeline/run":{"post":{"tags":["b2b-scores"],"summary":"Run Pipeline","description":"Batch-trigger a pipeline step for all (or specific) products in the tenant portfolio.","operationId":"run_pipeline_api_v1_b2b_pipeline_run_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_run_pipeline_api_v1_b2b_pipeline_run_post"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/category/pulse":{"get":{"tags":["b2b-scores"],"summary":"Get Category Pulse","description":"Category averages + biggest week-over-week score movers (risers/fallers).","operationId":"get_category_pulse_api_v1_b2b_category_pulse_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/products/{product_id}/voc":{"get":{"tags":["b2b-scores"],"summary":"Get Product Voc","description":"Voice-of-Customer executive summary (markdown) for one product.","operationId":"get_product_voc_api_v1_b2b_products__product_id__voc_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/products/{product_id}/history":{"get":{"tags":["b2b-scores"],"summary":"Get Product History","description":"Weekly score history for the trend chart (most recent `weeks`).","operationId":"get_product_history_api_v1_b2b_products__product_id__history_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}},{"name":"weeks","in":"query","required":false,"schema":{"type":"integer","maximum":52,"minimum":1,"default":12,"title":"Weeks"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SKUScoreHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/products/{product_id}/usage":{"get":{"tags":["b2b-scores"],"summary":"Get Product Usage","description":"SerpAPI call count + Gemini call count/tokens/estimated cost for this\nproduct's pipeline runs — cumulative all-time plus the most recent run.\n\nThis reflects the whole global product's pipeline history (enrich +\nnormalize run once per product, shared across every tenant tracking it),\nnot just this tenant's own trigger of it.","operationId":"get_product_usage_api_v1_b2b_products__product_id__usage_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/products/{product_id}/defects":{"get":{"tags":["b2b-scores"],"summary":"Get Product Defects","description":"Individual defect records for one product.\n\nReturns the **paraphrased** evidence only — the raw ``quote`` is internal-only and\nnever leaves the database (PRD §7 derived-only constraint).\n\n``attribution=component_signal`` is the BD-7 \"likely-your-component signal\"\ntoggle — PSU/enclosure/firmware themes never appear under that filter since\nthey classify to ``excluded``/``other_component``, never ``component_signal``.","operationId":"get_product_defects_api_v1_b2b_products__product_id__defects_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}},{"name":"attribution","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter (BD-7): component_signal|other_component|excluded","title":"Attribution"},"description":"Filter (BD-7): component_signal|other_component|excluded"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DefectListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/products/{product_id}/reviews":{"get":{"tags":["b2b-scores"],"summary":"Get Product Reviews","description":"Raw reviews for a product: text, source, author, date, rating, verified.\n\nSources: google (Shopping scraper), store (retailer pages), reddit, forum, cpsc.\nVerified=true for google + store; false for reddit, forum.\nResults ordered by published_at desc (newest first) for time-series use.","operationId":"get_product_reviews_api_v1_b2b_products__product_id__reviews_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter: google|store|reddit|forum|cpsc","title":"Source"},"description":"Filter: google|store|reddit|forum|cpsc"},{"name":"verified","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter verified/unverified","title":"Verified"},"description":"Filter verified/unverified"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/products/{product_id}/reviews/timeline":{"get":{"tags":["b2b-scores"],"summary":"Get Reviews Timeline","description":"Weekly review volume per source — for time-series charts.\n\nReturns buckets of (week, source, count, avg_rating) ordered oldest→newest.\nOnly includes reviews with a known published_at date.","operationId":"get_reviews_timeline_api_v1_b2b_products__product_id__reviews_timeline_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/products/{product_id}/absa":{"get":{"tags":["b2b-scores"],"summary":"Get Product Absa","description":"Aspect-based sentiment breakdown for one product.","operationId":"get_product_absa_api_v1_b2b_products__product_id__absa_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ABSAResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/products/{product_id}/social-proof":{"get":{"tags":["b2b-scores"],"summary":"Get Social Proof","description":"Video reviews + short-form videos for a product with AI summaries.","operationId":"get_social_proof_api_v1_b2b_products__product_id__social_proof_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialProofResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/products/{product_id}/social-proof/refresh":{"post":{"tags":["b2b-scores"],"summary":"Refresh Social Proof","description":"Trigger a fresh video fetch + AI summarization for a product.","operationId":"refresh_social_proof_api_v1_b2b_products__product_id__social_proof_refresh_post","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/alerts/demo-qa/{product_id}":{"get":{"tags":["b2b-alerts"],"summary":"Demo Qa Check","description":"F9 Demo QA: run all trust-rule checks for a product.\n\nReturns 200 with ``all_passed=true`` when ready to demo;\nreturns 422 if any hard failures are found.","operationId":"demo_qa_check_api_v1_b2b_alerts_demo_qa__product_id__get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}},{"name":"rendered_card","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"JSON-encoded card payload for text-level checks","title":"Rendered Card"},"description":"JSON-encoded card payload for text-level checks"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/alerts/defect-signals":{"get":{"tags":["b2b-alerts"],"summary":"List Defect Signals","description":"Fired defect signals for this tenant's products, enriched with evidence + timeline.","operationId":"list_defect_signals_api_v1_b2b_alerts_defect_signals_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":7,"default":90,"title":"Days"}},{"name":"min_z","in":"query","required":false,"schema":{"type":"number","maximum":10.0,"minimum":0.0,"default":1.5,"title":"Min Z"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/alerts/calibration/{product_id}":{"get":{"tags":["b2b-alerts"],"summary":"Get Calibration","description":"F1 — Return calibration status + all data points for a product.\n\nIf ≥3 points exist: returns fitted k-multiplier and current estimate bands.\nOtherwise: returns calibrated=false with pilot-required message.","operationId":"get_calibration_api_v1_b2b_alerts_calibration__product_id__get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}},{"name":"defect_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Defect Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["b2b-alerts"],"summary":"Add Calibration Point","description":"F1 — Add one (signal_rate, failure_rate) pair from the partner's warranty data.","operationId":"add_calibration_point_api_v1_b2b_alerts_calibration__product_id__post","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalibrationPointIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/alerts/calibration/{product_id}/{point_id}":{"delete":{"tags":["b2b-alerts"],"summary":"Delete Calibration Point","description":"F1 — Remove a calibration data point.","operationId":"delete_calibration_point_api_v1_b2b_alerts_calibration__product_id___point_id__delete","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}},{"name":"point_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Point Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/alerts/rules":{"get":{"tags":["b2b-alerts"],"summary":"List Rules","operationId":"list_rules_api_v1_b2b_alerts_rules_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertRuleListResponse"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]},"post":{"tags":["b2b-alerts"],"summary":"Create Rule","operationId":"create_rule_api_v1_b2b_alerts_rules_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertRuleCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertRuleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/alerts/rules/{rule_id}":{"patch":{"tags":["b2b-alerts"],"summary":"Update Rule","operationId":"update_rule_api_v1_b2b_alerts_rules__rule_id__patch","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Rule Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertRuleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertRuleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["b2b-alerts"],"summary":"Delete Rule","operationId":"delete_rule_api_v1_b2b_alerts_rules__rule_id__delete","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Rule Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/alerts/events":{"get":{"tags":["b2b-alerts"],"summary":"List Events","operationId":"list_events_api_v1_b2b_alerts_events_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":90,"title":"Days"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertEventListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/compare":{"post":{"tags":["b2b-compare"],"summary":"Compare Products","description":"Compare 2–5 watched products across the 7 IMO components + defect themes.","operationId":"compare_products_api_v1_b2b_compare_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompareRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompareResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/products/{product_id}/competitors/suggest":{"get":{"tags":["b2b-compare"],"summary":"Suggest Competitors","description":"Suggest competitor products (same category + price band) to add as benchmarks.","operationId":"suggest_competitors_api_v1_b2b_products__product_id__competitors_suggest_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":5,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuggestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/api-keys":{"get":{"tags":["b2b-api-keys"],"summary":"List Api Keys","operationId":"list_api_keys_api_v1_b2b_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyListResponse"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]},"post":{"tags":["b2b-api-keys"],"summary":"Create Api Key","description":"Create a Personal-API key. The plaintext key is returned ONCE — store it now.","operationId":"create_api_key_api_v1_b2b_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/api-keys/{key_id}":{"delete":{"tags":["b2b-api-keys"],"summary":"Revoke Api Key","operationId":"revoke_api_key_api_v1_b2b_api_keys__key_id__delete","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/api-keys/{key_id}/rotate":{"post":{"tags":["b2b-api-keys"],"summary":"Rotate Api Key","description":"Rotate an API key.\n\nCreates a new key with the same name, daily_limit, and scopes.  The old key\nenters a 7-day 'rotating' grace window during which it remains valid, allowing\nintegrations to migrate to the new key without downtime.\n\nThe new plaintext key is returned ONCE — store it now.","operationId":"rotate_api_key_api_v1_b2b_api_keys__key_id__rotate_post","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/personal/portfolio":{"get":{"tags":["personal-api"],"summary":"Personal Portfolio","description":"The tenant's portfolio with current scores (JSON or CSV).","operationId":"personal_portfolio_api_v1_personal_portfolio_get","parameters":[{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(json|csv)$","default":"json","title":"Format"}},{"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"}}}}}}},"/api/v1/personal/products/{product_id}/score":{"get":{"tags":["personal-api"],"summary":"Personal Product Score","description":"Derived score + component breakdown for one watched product.","operationId":"personal_product_score_api_v1_personal_products__product_id__score_get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/search":{"get":{"tags":["public"],"summary":"Public Search","description":"Search products by name/ASIN (only products already in the graph).","operationId":"public_search_api_v1_public_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/methodology":{"get":{"tags":["public"],"summary":"Public Methodology","description":"The published IMO Score methodology (legal-armor transparency page).","operationId":"public_methodology_api_v1_public_methodology_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/public/products/{slug}":{"get":{"tags":["public"],"summary":"Public Score Page","description":"Public score page for one product, or 404 if not in the graph.","operationId":"public_score_page_api_v1_public_products__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/products/{slug}/card.svg":{"get":{"tags":["public"],"summary":"Public Score Card","description":"1080×1080 shareable score card (SVG).","operationId":"public_score_card_api_v1_public_products__slug__card_svg_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/claims":{"post":{"tags":["public"],"summary":"Initiate Claim","description":"Start a brand-ownership claim (DNS TXT or email-domain verification).","operationId":"initiate_claim_api_v1_public_claims_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimInitiateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/claims/{claim_id}/verify":{"post":{"tags":["public"],"summary":"Verify Claim","description":"Verify a pending claim (email code or DNS TXT record).","operationId":"verify_claim_api_v1_public_claims__claim_id__verify_post","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Claim Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimVerifyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/claims/{claim_id}/response":{"post":{"tags":["public"],"summary":"Submit Brand Response","description":"Post a manufacturer response on a product page (requires a verified claim).","operationId":"submit_brand_response_api_v1_public_claims__claim_id__response_post","parameters":[{"name":"claim_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Claim Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandResponseRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/ai/chat":{"post":{"tags":["b2b-ai"],"summary":"Chat","operationId":"chat_api_v1_b2b_ai_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__routes__b2b__ai__ChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__routes__b2b__ai__ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/ai/chat/stream":{"post":{"tags":["b2b-ai"],"summary":"Chat Stream","operationId":"chat_stream_api_v1_b2b_ai_chat_stream_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__routes__b2b__ai__ChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/audit-logs":{"get":{"tags":["b2b-audit"],"summary":"Get Audit Logs","description":"Get audit logs for the current tenant. Owner and Admin only.","operationId":"get_audit_logs_api_v1_b2b_audit_logs_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}},{"name":"resource","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource"}},{"name":"actor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Id"}},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":50,"title":"Page Size"}},{"name":"export","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Export"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/webhooks/":{"get":{"tags":["b2b-webhooks"],"summary":"List Webhooks","description":"List all registered webhooks for this tenant (secret NOT included).","operationId":"list_webhooks_api_v1_b2b_webhooks__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/WebhookResponse"},"type":"array","title":"Response List Webhooks Api V1 B2B Webhooks  Get"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]},"post":{"tags":["b2b-webhooks"],"summary":"Create Webhook","description":"Register a new webhook endpoint.\n\nReturns the webhook record including the plain HMAC secret.\n**Store the secret now — it cannot be recovered.**","operationId":"create_webhook_api_v1_b2b_webhooks__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/webhooks/{webhook_id}":{"delete":{"tags":["b2b-webhooks"],"summary":"Delete Webhook","description":"Delete a registered webhook.","operationId":"delete_webhook_api_v1_b2b_webhooks__webhook_id__delete","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Webhook Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/webhooks/{webhook_id}/test":{"post":{"tags":["b2b-webhooks"],"summary":"Test Webhook","description":"Send a test delivery to this webhook.\n\nEnqueues a Celery task — use GET ``/{webhook_id}/deliveries`` to check\nthe result after a few seconds.","operationId":"test_webhook_api_v1_b2b_webhooks__webhook_id__test_post","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Webhook Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/webhooks/{webhook_id}/deliveries":{"get":{"tags":["b2b-webhooks"],"summary":"Get Deliveries","description":"Paginated delivery history for a webhook.","operationId":"get_deliveries_api_v1_b2b_webhooks__webhook_id__deliveries_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Webhook Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDeliveryResponse"},"title":"Response Get Deliveries Api V1 B2B Webhooks  Webhook Id  Deliveries Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/settings/ip-allowlist":{"get":{"tags":["b2b-ip-allowlist"],"summary":"List Ip Allowlist","description":"Return all IP allowlist entries and the current enforcement state.","operationId":"list_ip_allowlist_api_v1_b2b_settings_ip_allowlist_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IPAllowlistListResponse"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]},"post":{"tags":["b2b-ip-allowlist"],"summary":"Add Cidr Entry","description":"Add a CIDR range to the tenant's IP allowlist.","operationId":"add_cidr_entry_api_v1_b2b_settings_ip_allowlist_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddCIDRRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IPAllowlistEntryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/settings/ip-allowlist/{entry_id}":{"delete":{"tags":["b2b-ip-allowlist"],"summary":"Remove Cidr Entry","description":"Remove a CIDR entry from the tenant's IP allowlist.","operationId":"remove_cidr_entry_api_v1_b2b_settings_ip_allowlist__entry_id__delete","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"entry_id","in":"path","required":true,"schema":{"type":"string","title":"Entry Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/settings/ip-allowlist/toggle":{"put":{"tags":["b2b-ip-allowlist"],"summary":"Toggle Ip Allowlist","description":"Enable or disable IP allowlist enforcement for the tenant.","operationId":"toggle_ip_allowlist_api_v1_b2b_settings_ip_allowlist_toggle_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToggleRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/auth/saml/metadata":{"get":{"tags":["b2b-sso"],"summary":"Saml Metadata","description":"Return the SP metadata XML that the IdP needs to register this service.\n\nNo authentication required — IdP admins fetch this during initial setup.","operationId":"saml_metadata_api_v1_b2b_auth_saml_metadata_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/b2b/auth/saml/login":{"get":{"tags":["b2b-sso"],"summary":"Saml Login","description":"Redirect the browser to the IdP SSO URL to initiate a SAML flow.","operationId":"saml_login_api_v1_b2b_auth_saml_login_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/b2b/auth/saml/callback":{"post":{"tags":["b2b-sso"],"summary":"Saml Callback","description":"ACS (Assertion Consumer Service) endpoint.\n\nValidates the SAML response from the IdP.  On success, mints B2B JWT\ntokens and redirects to the frontend with them in query params.\n\nThe redirect URL is::\n\n    {FRONTEND_URL}/sso-callback?token={access}&refresh={refresh_token}","operationId":"saml_callback_api_v1_b2b_auth_saml_callback_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_saml_callback_api_v1_b2b_auth_saml_callback_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/v1/b2b/settings/sso":{"get":{"tags":["b2b-sso"],"summary":"Get Sso Config","description":"Retrieve the current SSO configuration (certificate is not returned).","operationId":"get_sso_config_api_v1_b2b_settings_sso_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SSOConfigResponse"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]},"put":{"tags":["b2b-sso"],"summary":"Save Sso Config","description":"Create or replace the SSO configuration for this tenant.","operationId":"save_sso_config_api_v1_b2b_settings_sso_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SSOConfigRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SSOConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]},"delete":{"tags":["b2b-sso"],"summary":"Delete Sso Config","description":"Remove the SSO configuration for this tenant.","operationId":"delete_sso_config_api_v1_b2b_settings_sso_delete","responses":{"204":{"description":"Successful Response"}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/export":{"post":{"tags":["b2b-export"],"summary":"Trigger Export","description":"Queue a full data export for this tenant. Returns immediately with an export_id.","operationId":"trigger_export_api_v1_b2b_export_post","responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/export/status":{"get":{"tags":["b2b-export"],"summary":"Export Status","description":"Return the current export status for this tenant.","operationId":"export_status_api_v1_b2b_export_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/export/{export_id}/download":{"get":{"tags":["b2b-export"],"summary":"Download Export","description":"Stream the ZIP export file as an attachment.\n\nValidates that the export_id belongs to the requesting tenant's latest export\nbefore serving the file — prevents tenants from downloading each other's exports.","operationId":"download_export_api_v1_b2b_export__export_id__download_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"export_id","in":"path","required":true,"schema":{"type":"string","title":"Export Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/users/me/export":{"get":{"tags":["b2b-gdpr"],"summary":"Export My Data","description":"Return all personal data held for the requesting user (GDPR Art. 20).","operationId":"export_my_data_api_v1_b2b_users_me_export_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/users/me/data":{"delete":{"tags":["b2b-gdpr"],"summary":"Delete My Data","description":"Erase all PII for the requesting user (GDPR Art. 17).\n\nThe user account is anonymised and marked deleted. The audit trail rows\nare kept but the email address is replaced with a pseudonym.\nOwners must offboard the whole tenant via DELETE /settings/account first.","operationId":"delete_my_data_api_v1_b2b_users_me_data_delete","responses":{"204":{"description":"Successful Response"}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/settings/account":{"delete":{"tags":["b2b-gdpr"],"summary":"Delete Tenant Account","description":"Full tenant offboarding and erasure (GDPR Art. 17).\n\n- Anonymises all user accounts (email, name, credentials, MFA).\n- Hard-deletes API keys, webhooks, SSO config, IP allowlist, pending invites.\n- Cancels the tenant.\n\nEnrichment data (products, scores, reviews) is retained — it is shared\nacross tenants and contains no PII.\n\nTHIS ACTION IS IRREVERSIBLE.","operationId":"delete_tenant_account_api_v1_b2b_settings_account_delete","responses":{"204":{"description":"Successful Response"}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/integrations/jira/status":{"get":{"tags":["b2b-jira"],"summary":"Get Status","operationId":"get_status_api_v1_b2b_integrations_jira_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__routes__b2b__jira__ConnectionStatusResponse"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/integrations/jira/connect":{"get":{"tags":["b2b-jira"],"summary":"Start Connect","description":"Return the Atlassian consent-screen URL for the admin to visit.","operationId":"start_connect_api_v1_b2b_integrations_jira_connect_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorizeUrlResponse"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/integrations/jira/callback":{"get":{"tags":["b2b-jira"],"summary":"Oauth Callback","description":"Atlassian redirects here after the admin grants consent.\n\nNot bearer-authenticated (the browser has no B2B token at this point in\nthe redirect chain) — the tenant/user are recovered from the signed\n``state`` token minted by ``/connect``.","operationId":"oauth_callback_api_v1_b2b_integrations_jira_callback_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}},{"name":"state","in":"query","required":true,"schema":{"type":"string","title":"State"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/integrations/jira/disconnect":{"delete":{"tags":["b2b-jira"],"summary":"Disconnect","operationId":"disconnect_api_v1_b2b_integrations_jira_disconnect_delete","responses":{"204":{"description":"Successful Response"}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/integrations/jira/projects":{"get":{"tags":["b2b-jira"],"summary":"List Projects","operationId":"list_projects_api_v1_b2b_integrations_jira_projects_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/integrations/jira/projects/{project_key}/components":{"get":{"tags":["b2b-jira"],"summary":"List Components","operationId":"list_components_api_v1_b2b_integrations_jira_projects__project_key__components_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"project_key","in":"path","required":true,"schema":{"type":"string","title":"Project Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/integrations/jira/mappings":{"get":{"tags":["b2b-jira"],"summary":"List Mappings","operationId":"list_mappings_api_v1_b2b_integrations_jira_mappings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/app__api__routes__b2b__jira__MappingResponse"},"type":"array","title":"Response List Mappings Api V1 B2B Integrations Jira Mappings Get"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]},"post":{"tags":["b2b-jira"],"summary":"Create Mapping","operationId":"create_mapping_api_v1_b2b_integrations_jira_mappings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__routes__b2b__jira__MappingCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__routes__b2b__jira__MappingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/integrations/jira/mappings/{mapping_id}":{"delete":{"tags":["b2b-jira"],"summary":"Delete Mapping","operationId":"delete_mapping_api_v1_b2b_integrations_jira_mappings__mapping_id__delete","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"mapping_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Mapping Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/integrations/jira/mappings/{mapping_id}/backfill":{"post":{"tags":["b2b-jira"],"summary":"Trigger Backfill","operationId":"trigger_backfill_api_v1_b2b_integrations_jira_mappings__mapping_id__backfill_post","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"mapping_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Mapping Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/integrations/jira/issues":{"get":{"tags":["b2b-jira"],"summary":"List Issues","operationId":"list_issues_api_v1_b2b_integrations_jira_issues_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/IssueResponse"},"title":"Response List Issues Api V1 B2B Integrations Jira Issues Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/integrations/jira/issues/unassigned":{"get":{"tags":["b2b-jira"],"summary":"List Unassigned Issues","description":"Tickets in scope whose product couldn't be auto-detected confidently —\nsurfaced so a human can assign them instead of silently dropping the data.","operationId":"list_unassigned_issues_api_v1_b2b_integrations_jira_issues_unassigned_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/IssueResponse"},"title":"Response List Unassigned Issues Api V1 B2B Integrations Jira Issues Unassigned Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/integrations/jira/issues/{issue_id}/assign":{"post":{"tags":["b2b-jira"],"summary":"Assign Issue","operationId":"assign_issue_api_v1_b2b_integrations_jira_issues__issue_id__assign_post","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"issue_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Issue Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignProductRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/integrations/jira/corroboration/{product_id}":{"get":{"tags":["b2b-jira"],"summary":"Get Corroboration","operationId":"get_corroboration_api_v1_b2b_integrations_jira_corroboration__product_id__get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/integrations/jira/webhook/{connection_id}":{"post":{"tags":["b2b-jira"],"summary":"Jira Webhook","description":"Jira Cloud dynamic webhooks are not HMAC-signed — the registered callback\nURL embeds an opaque per-connection token (hashed at rest, like ApiKey).","operationId":"jira_webhook_api_v1_b2b_integrations_jira_webhook__connection_id__post","parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Connection Id"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/integrations/hubspot/status":{"get":{"tags":["b2b-hubspot"],"summary":"Get Status","operationId":"get_status_api_v1_b2b_integrations_hubspot_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__routes__b2b__hubspot__ConnectionStatusResponse"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/integrations/hubspot/connect":{"post":{"tags":["b2b-hubspot"],"summary":"Connect","description":"Validate + store a pasted HubSpot Private App access token.","operationId":"connect_api_v1_b2b_integrations_hubspot_connect_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__routes__b2b__hubspot__ConnectionStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/integrations/hubspot/disconnect":{"delete":{"tags":["b2b-hubspot"],"summary":"Disconnect","operationId":"disconnect_api_v1_b2b_integrations_hubspot_disconnect_delete","responses":{"204":{"description":"Successful Response"}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/integrations/hubspot/pipelines":{"get":{"tags":["b2b-hubspot"],"summary":"List Pipelines","operationId":"list_pipelines_api_v1_b2b_integrations_hubspot_pipelines_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/integrations/hubspot/mappings":{"get":{"tags":["b2b-hubspot"],"summary":"List Mappings","operationId":"list_mappings_api_v1_b2b_integrations_hubspot_mappings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/app__api__routes__b2b__hubspot__MappingResponse"},"type":"array","title":"Response List Mappings Api V1 B2B Integrations Hubspot Mappings Get"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]},"post":{"tags":["b2b-hubspot"],"summary":"Create Mapping","operationId":"create_mapping_api_v1_b2b_integrations_hubspot_mappings_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__routes__b2b__hubspot__MappingCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__api__routes__b2b__hubspot__MappingResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"B2BOAuth2PasswordBearer":[]}]}},"/api/v1/b2b/integrations/hubspot/mappings/{mapping_id}":{"delete":{"tags":["b2b-hubspot"],"summary":"Delete Mapping","operationId":"delete_mapping_api_v1_b2b_integrations_hubspot_mappings__mapping_id__delete","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"mapping_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Mapping Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/integrations/hubspot/mappings/{mapping_id}/sync":{"post":{"tags":["b2b-hubspot"],"summary":"Trigger Sync","operationId":"trigger_sync_api_v1_b2b_integrations_hubspot_mappings__mapping_id__sync_post","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"mapping_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Mapping Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/integrations/hubspot/tickets":{"get":{"tags":["b2b-hubspot"],"summary":"List Tickets","operationId":"list_tickets_api_v1_b2b_integrations_hubspot_tickets_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TicketResponse"},"title":"Response List Tickets Api V1 B2B Integrations Hubspot Tickets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/integrations/hubspot/tickets/unassigned":{"get":{"tags":["b2b-hubspot"],"summary":"List Unassigned Tickets","operationId":"list_unassigned_tickets_api_v1_b2b_integrations_hubspot_tickets_unassigned_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TicketResponse"},"title":"Response List Unassigned Tickets Api V1 B2B Integrations Hubspot Tickets Unassigned Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/integrations/hubspot/tickets/{ticket_id}/assign":{"post":{"tags":["b2b-hubspot"],"summary":"Assign Ticket","operationId":"assign_ticket_api_v1_b2b_integrations_hubspot_tickets__ticket_id__assign_post","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"ticket_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Ticket Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignProductRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/integrations/hubspot/corroboration/{product_id}":{"get":{"tags":["b2b-hubspot"],"summary":"Get Corroboration","operationId":"get_corroboration_api_v1_b2b_integrations_hubspot_corroboration__product_id__get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/products/{product_id}/components":{"get":{"tags":["b2b-components"],"summary":"Get Product Components","description":"BD-4 — the resolved chip mapping for one SKU, with provenance.","operationId":"get_product_components_api_v1_b2b_products__product_id__components_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductComponentsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/products/{product_id}/component-breakdown":{"get":{"tags":["b2b-components"],"summary":"Get Component Breakdown","description":"BD-7 — per-function breakdown of how much of this SKU's defect chatter is\nlikely Broadcom-component signal vs other-component vs excluded confounder.","operationId":"get_component_breakdown_api_v1_b2b_products__product_id__component_breakdown_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentBreakdownResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/b2b/broadcom/chip-families":{"get":{"tags":["b2b-components"],"summary":"Get Chip Family Rollup","description":"BD-8 — aggregate component-signal defects across every watched SKU that\nshares a chip part number. The view a chip supplier actually wants: not\n\"how does this one router perform\" but \"how does BCM4908 perform across\nevery SKU we track that uses it.\"","operationId":"get_chip_family_rollup_api_v1_b2b_broadcom_chip_families_get","security":[{"B2BOAuth2PasswordBearer":[]}],"parameters":[{"name":"min_skus","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Only include chip families used by at least this many watched SKUs","default":1,"title":"Min Skus"},"description":"Only include chip families used by at least this many watched SKUs"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChipFamilyRollupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/tenants":{"get":{"tags":["internal"],"summary":"List Tenants","description":"List all tenants with top-level stats.","operationId":"list_tenants_internal_tenants_get","parameters":[{"name":"x-admin-token","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/tenants/{tenant_id}":{"get":{"tags":["internal"],"summary":"Get Tenant","description":"Single-tenant deep-dive: stats + pipeline breakdown + errored products.","operationId":"get_tenant_internal_tenants__tenant_id__get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"x-admin-token","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/pipeline/health":{"get":{"tags":["internal"],"summary":"Pipeline Health","description":"Cross-tenant pipeline summary.","operationId":"pipeline_health_internal_pipeline_health_get","parameters":[{"name":"x-admin-token","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/tenants/{tenant_id}/enrich-all":{"post":{"tags":["internal"],"summary":"Enrich All","description":"Reset all error/pending products for this tenant to pending and re-enqueue.","operationId":"enrich_all_internal_tenants__tenant_id__enrich_all_post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"x-admin-token","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Token"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/costs/usage":{"get":{"tags":["internal"],"summary":"Costs Usage","description":"Rough cost/usage estimates across the platform.","operationId":"costs_usage_internal_costs_usage_get","parameters":[{"name":"x-admin-token","in":"header","required":true,"schema":{"type":"string","title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"Health Check","description":"Health check endpoint.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/deprecation-policy":{"get":{"tags":["meta"],"summary":"Deprecation Policy","description":"Versioning and retirement policy for the public API.","operationId":"deprecation_policy_api_v1_deprecation_policy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/onboarding":{"get":{"tags":["meta"],"summary":"Agent Onboarding","description":"Machine-readable onboarding options for agents and developers.","operationId":"agent_onboarding_api_v1_onboarding_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"summary":"Root","description":"Root endpoint with API documentation.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"ABSAResponse":{"properties":{"product_id":{"type":"string","title":"Product Id"},"aspects":{"items":{"$ref":"#/components/schemas/AspectSentiment"},"type":"array","title":"Aspects"}},"type":"object","required":["product_id","aspects"],"title":"ABSAResponse"},"AIProductAnalysis":{"properties":{"summary":{"type":"string","title":"Summary","description":"1-2 sentence product summary"},"pros":{"items":{"type":"string"},"type":"array","title":"Pros","description":"Top 5 pros"},"cons":{"items":{"type":"string"},"type":"array","title":"Cons","description":"Top 5 cons"},"deal_breakers":{"items":{"type":"string"},"type":"array","title":"Deal Breakers","description":"Deal-breaker issues"},"sentiment_score":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Sentiment Score","description":"Overall sentiment 0-1","default":0.5},"verdict_score":{"type":"number","maximum":10.0,"minimum":1.0,"title":"Verdict Score","description":"Verdict score 1-10","default":5.0},"who_should_buy":{"type":"string","title":"Who Should Buy","description":"Target customer types","default":""},"who_should_avoid":{"type":"string","title":"Who Should Avoid","description":"Customer types to avoid","default":""}},"type":"object","required":["summary"],"title":"AIProductAnalysis","description":"AI-powered product analysis from Gemini."},"AIVerdictRequest":{"properties":{"enriched_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Enriched Data","description":"Full enriched product data. If omitted, backend fetches from Redis cache."},"scrape_stores":{"type":"boolean","title":"Scrape Stores","description":"Whether to scrape store pages for additional insights","default":false}},"type":"object","title":"AIVerdictRequest","description":"Request to generate AI verdict for a product."},"AcceptInviteRequest":{"properties":{"token":{"type":"string","title":"Token"},"password":{"type":"string","title":"Password"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"}},"type":"object","required":["token","password"],"title":"AcceptInviteRequest","description":"Accept an invitation and set a password."},"AccuracyReportRequest":{"properties":{"product_id":{"type":"string","title":"Product Id"},"category":{"type":"string","title":"Category","description":"wrong_score | missing_deal_breaker | outdated_price | fake_reviews_not_caught | other"},"message":{"type":"string","minLength":1,"title":"Message"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"score_card | web_agent | help_us_get_it_right"}},"type":"object","required":["product_id","category","message"],"title":"AccuracyReportRequest"},"AccuracyReportResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"product_id":{"type":"string","title":"Product Id"},"category":{"type":"string","title":"Category"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","product_id","category","status","created_at"],"title":"AccuracyReportResponse"},"ActivateTrialRequest":{"properties":{"success_url":{"type":"string","title":"Success Url"},"cancel_url":{"type":"string","title":"Cancel Url"},"whatsapp_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whatsapp Number"}},"type":"object","required":["success_url","cancel_url"],"title":"ActivateTrialRequest","description":"Trial is created via Stripe Checkout (subscription + trial_period_days)."},"ActivityEventResponse":{"properties":{"id":{"type":"string","format":"uuid4","title":"Id"},"activity_type":{"type":"string","title":"Activity Type"},"product_id":{"anyOf":[{"type":"string","format":"uuid4"},{"type":"null"}],"title":"Product Id"},"product_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Title"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","activity_type","created_at"],"title":"ActivityEventResponse"},"AddCIDRRequest":{"properties":{"cidr":{"type":"string","title":"Cidr","description":"CIDR notation, e.g. '203.0.113.0/24' or '198.51.100.5/32'"},"label":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Label","description":"Human-readable label"}},"type":"object","required":["cidr"],"title":"AddCIDRRequest"},"AdminEmailRequest":{"properties":{"to":{"type":"string","title":"To"},"subject":{"type":"string","title":"Subject"},"body":{"type":"string","title":"Body"}},"type":"object","required":["to","subject","body"],"title":"AdminEmailRequest"},"AdminTenantUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"},"sku_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sku Limit"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"owner_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Email"}},"type":"object","title":"AdminTenantUpdate"},"AgentChatRequest":{"properties":{"agent_type":{"type":"string","title":"Agent Type","description":"Agent type: volt, babywise, ace, hearth, sip, trail, sommelier"},"message":{"type":"string","title":"Message","description":"User's message"},"conversation_history":{"items":{"$ref":"#/components/schemas/app__api__routes__chatbot__ChatMessage"},"type":"array","title":"Conversation History"},"product_context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Product Context","description":"Product context when chatting from a product page"},"funnel_state":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Funnel State","description":"Serialized funnel state from previous turn"},"session_state":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Session State","description":"Serialized session state from previous turn"},"is_pro":{"type":"boolean","title":"Is Pro","description":"Whether user has Pro subscription","default":false}},"type":"object","required":["agent_type","message"],"title":"AgentChatRequest","description":"Request model for agent chatbot."},"AgentChatResponse":{"properties":{"message":{"type":"string","title":"Message"},"agent_name":{"type":"string","title":"Agent Name"},"agent_emoji":{"type":"string","title":"Agent Emoji"},"agent_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Type"},"suggested_products":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Suggested Products"},"search_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search Url"},"mini_imo_score":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Mini Imo Score"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"funnel_state":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Funnel State"},"session_state":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Session State"},"reveal":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Reveal"},"upgrade_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upgrade Prompt"}},"type":"object","required":["message","agent_name","agent_emoji"],"title":"AgentChatResponse","description":"Response model for agent chatbot."},"AgentProfileResponse":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"agent_id":{"type":"string","title":"Agent Id"},"budget_range":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Budget Range"},"priority_weights":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Priority Weights"},"avoided_brands":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Avoided Brands"},"preferred_brands":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Preferred Brands"},"use_cases":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Use Cases"},"previous_purchases":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Previous Purchases"},"form_factor_preference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Form Factor Preference"},"custom_preferences":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom Preferences"},"profile_version":{"type":"integer","title":"Profile Version"},"confidence_level":{"type":"number","title":"Confidence Level"},"total_sessions":{"type":"integer","title":"Total Sessions"},"last_conversation_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Conversation Summary"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","user_id","agent_id","profile_version","confidence_level","total_sessions","created_at","updated_at"],"title":"AgentProfileResponse","description":"Full agent profile response."},"AlertEventListResponse":{"properties":{"events":{"items":{"$ref":"#/components/schemas/AlertEventResponse"},"type":"array","title":"Events"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["events","total","page","page_size"],"title":"AlertEventListResponse"},"AlertEventResponse":{"properties":{"id":{"type":"string","title":"Id"},"product_id":{"type":"string","title":"Product Id"},"rule_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rule Id"},"payload":{"additionalProperties":true,"type":"object","title":"Payload"},"triggered_at":{"type":"string","format":"date-time","title":"Triggered At"},"delivered":{"type":"boolean","title":"Delivered"}},"type":"object","required":["id","product_id","payload","triggered_at","delivered"],"title":"AlertEventResponse"},"AlertRuleCreate":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"condition":{"additionalProperties":true,"type":"object","title":"Condition"},"channels":{"items":{"type":"string"},"type":"array","title":"Channels","default":["email"]},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url"}},"type":"object","required":["name","condition"],"title":"AlertRuleCreate"},"AlertRuleListResponse":{"properties":{"rules":{"items":{"$ref":"#/components/schemas/AlertRuleResponse"},"type":"array","title":"Rules"}},"type":"object","required":["rules"],"title":"AlertRuleListResponse"},"AlertRuleResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"condition":{"additionalProperties":true,"type":"object","title":"Condition"},"channels":{"items":{"type":"string"},"type":"array","title":"Channels"},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url"},"enabled":{"type":"boolean","title":"Enabled"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","condition","channels","enabled","created_at"],"title":"AlertRuleResponse"},"AlertRuleUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"condition":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Condition"},"channels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Channels"},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"type":"object","title":"AlertRuleUpdate"},"AmazonProductAnalysis":{"properties":{"asin":{"type":"string","title":"Asin","description":"Amazon ASIN - unique product identifier"},"parent_asin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Asin","description":"Parent ASIN for variants"},"title":{"type":"string","title":"Title","description":"Product title from Amazon"},"brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand","description":"Brand from Amazon"},"manufacturer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manufacturer","description":"Manufacturer from Amazon"},"images":{"items":{"type":"string"},"type":"array","title":"Images","description":"Product images from Amazon"},"bullet_points":{"type":"string","title":"Bullet Points","description":"Key features from Amazon","default":""},"description":{"type":"string","title":"Description","description":"Full description from Amazon","default":""},"category":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Category","description":"Product category from Amazon (array of category objects)"},"price":{"type":"number","title":"Price","description":"Current Amazon price","default":0.0},"price_strikethrough":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Strikethrough","description":"Original price before discount"},"discount_percentage":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Discount Percentage","description":"Discount % from Amazon"},"currency":{"type":"string","title":"Currency","default":"USD"},"buybox":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Buybox","description":"Amazon buybox offers with seller info"},"variants":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Variants","description":"Available product variants from Amazon"},"rating":{"type":"number","title":"Rating","description":"Average rating from Amazon reviews","default":0.0},"rating_distribution":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Rating Distribution","description":"Rating breakdown % from Amazon (5★, 4★, etc)"},"total_reviews":{"type":"integer","title":"Total Reviews","description":"Total review count from Amazon","default":0},"sales_rank":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Sales Rank","description":"Best seller rank from Amazon (array of rank objects)"},"sales_volume":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sales Volume","description":"Sales volume from Amazon"},"amazon_reviews":{"items":{"$ref":"#/components/schemas/AmazonReview"},"type":"array","title":"Amazon Reviews","description":"Top reviews from Amazon (canonical source)"},"external_reviews":{"items":{"$ref":"#/components/schemas/ExternalReview"},"type":"array","title":"External Reviews","description":"Reviews from external sources (blogs, forums, Reddit, etc) - enrichment only"},"external_stores":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"External Stores","description":"Cross-store pricing from SerpAPI (eBay, Walmart, etc) - enrichment only"},"external_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"External Rating","description":"External rating/review count aggregated from SerpAPI sources"},"external_ratings_distribution":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"External Ratings Distribution","description":"External rating breakdown from SerpAPI (5★, 4★, etc) - supplements Amazon ratings"},"analysis":{"anyOf":[{"$ref":"#/components/schemas/AIProductAnalysis"},{"type":"null"}],"description":"AI-generated analysis combining Amazon + external reviews (Gemini)"},"fetched_at":{"type":"string","format":"date-time","title":"Fetched At"}},"type":"object","required":["asin","title"],"title":"AmazonProductAnalysis","description":"Complete Amazon product with all 3 layers: Data + Enrichment + Intelligence.\n\nThis is the stable, unified JSON schema served to UI.\nSingle source of truth per field (clearly marked)."},"AmazonReview":{"properties":{"id":{"type":"string","title":"Id"},"author":{"type":"string","title":"Author"},"rating":{"type":"integer","title":"Rating"},"title":{"type":"string","title":"Title"},"content":{"type":"string","title":"Content"},"timestamp":{"type":"string","title":"Timestamp"},"is_verified":{"type":"boolean","title":"Is Verified"},"helpful_count":{"type":"integer","title":"Helpful Count"}},"type":"object","required":["id","author","rating","title","content","timestamp","is_verified","helpful_count"],"title":"AmazonReview","description":"Amazon review from canonical source."},"ApiKeyCreateRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Name"},"daily_limit":{"type":"integer","maximum":10000.0,"minimum":1.0,"title":"Daily Limit","default":100}},"type":"object","title":"ApiKeyCreateRequest"},"ApiKeyCreatedResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"prefix":{"type":"string","title":"Prefix"},"daily_limit":{"type":"integer","title":"Daily Limit"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"key":{"type":"string","title":"Key"}},"type":"object","required":["id","prefix","daily_limit","created_at","key"],"title":"ApiKeyCreatedResponse"},"ApiKeyListResponse":{"properties":{"keys":{"items":{"$ref":"#/components/schemas/ApiKeyResponse"},"type":"array","title":"Keys"}},"type":"object","required":["keys"],"title":"ApiKeyListResponse"},"ApiKeyResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"prefix":{"type":"string","title":"Prefix"},"daily_limit":{"type":"integer","title":"Daily Limit"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"}},"type":"object","required":["id","prefix","daily_limit","created_at"],"title":"ApiKeyResponse"},"AspectSentiment":{"properties":{"aspect":{"type":"string","title":"Aspect"},"sentiment_score":{"type":"number","title":"Sentiment Score"},"mention_count":{"type":"integer","title":"Mention Count"},"quotes":{"items":{},"type":"array","title":"Quotes","default":[]}},"type":"object","required":["aspect","sentiment_score","mention_count"],"title":"AspectSentiment"},"AssignProductRequest":{"properties":{"product_id":{"type":"string","title":"Product Id"}},"type":"object","required":["product_id"],"title":"AssignProductRequest"},"AuthResponse":{"properties":{"user":{"$ref":"#/components/schemas/app__schemas__auth__UserResponse"},"token":{"$ref":"#/components/schemas/TokenResponse"}},"type":"object","required":["user","token"],"title":"AuthResponse","description":"Combined authentication response."},"AuthorizeUrlResponse":{"properties":{"authorize_url":{"type":"string","title":"Authorize Url"}},"type":"object","required":["authorize_url"],"title":"AuthorizeUrlResponse"},"B2BAuthResponse":{"properties":{"user":{"$ref":"#/components/schemas/B2BUserResponse"},"tokens":{"$ref":"#/components/schemas/B2BTokenResponse"}},"type":"object","required":["user","tokens"],"title":"B2BAuthResponse","description":"Returned on successful login / invite acceptance."},"B2BLoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"B2BLoginRequest","description":"Tenant user login. Tenant is resolved from the request subdomain/header."},"B2BMFAChallengeResponse":{"properties":{"requires_mfa":{"type":"boolean","title":"Requires Mfa","default":true},"mfa_token":{"type":"string","title":"Mfa Token"}},"type":"object","required":["mfa_token"],"title":"B2BMFAChallengeResponse","description":"Returned when login succeeds but MFA verification is still required."},"B2BRefreshRequest":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"B2BRefreshRequest"},"B2BTokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In"}},"type":"object","required":["access_token","refresh_token","expires_in"],"title":"B2BTokenResponse"},"B2BUserResponse":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"role":{"type":"string","title":"Role"},"status":{"type":"string","title":"Status"},"tenant":{"$ref":"#/components/schemas/TenantSummary"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"totp_enabled":{"type":"boolean","title":"Totp Enabled","default":false}},"type":"object","required":["id","email","role","status","tenant","created_at"],"title":"B2BUserResponse"},"BabywisePrelaunchCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Agent"}},"type":"object","required":["email"],"title":"BabywisePrelaunchCreate","description":"Schema for creating a new babywise prelaunch signup.","example":{"email":"user@example.com","user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}},"BabywisePrelaunchList":{"properties":{"total":{"type":"integer","title":"Total"},"items":{"items":{"$ref":"#/components/schemas/BabywisePrelaunchResponse"},"type":"array","title":"Items"}},"type":"object","required":["total","items"],"title":"BabywisePrelaunchList","description":"Schema for listing babywise prelaunch signups."},"BabywisePrelaunchResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Agent"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","email","user_agent","created_at","updated_at"],"title":"BabywisePrelaunchResponse","description":"Schema for babywise prelaunch signup response."},"BlogAttachmentResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"file_name":{"type":"string","title":"File Name"},"file_type":{"type":"string","title":"File Type"},"file_size":{"type":"integer","title":"File Size"},"s3_url":{"type":"string","title":"S3 Url"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","file_name","file_type","file_size","s3_url","created_at"],"title":"BlogAttachmentResponse","description":"Response model for blog attachments."},"BlogCreate":{"properties":{"title":{"type":"string","maxLength":500,"minLength":1,"title":"Title"},"excerpt":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Excerpt"},"content":{"type":"string","minLength":1,"title":"Content"},"category":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Category"},"read_time":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Read Time"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Published","default":false},"featured_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Featured Image"},"featured_video":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Featured Video"},"structured_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Structured Data"}},"type":"object","required":["title","content"],"title":"BlogCreate","description":"Schema for creating a blog post."},"BlogDeleteResponse":{"properties":{"message":{"type":"string","title":"Message"},"blog_id":{"type":"string","format":"uuid","title":"Blog Id"}},"type":"object","required":["message","blog_id"],"title":"BlogDeleteResponse","description":"Response model for blog deletion."},"BlogResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"title":{"type":"string","title":"Title"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Excerpt"},"content":{"type":"string","title":"Content"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"featured_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Featured Image"},"featured_video":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Featured Video"},"read_time":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Read Time"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"published":{"type":"boolean","title":"Published"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"attachments":{"anyOf":[{"items":{"$ref":"#/components/schemas/BlogAttachmentResponse"},"type":"array"},{"type":"null"}],"title":"Attachments"},"structured_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Structured Data"}},"type":"object","required":["id","user_id","title","excerpt","content","category","featured_image","featured_video","read_time","tags","published","created_at","updated_at","published_at"],"title":"BlogResponse","description":"Response model for blog posts."},"BlogUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Title"},"excerpt":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Excerpt"},"content":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Content"},"category":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Category"},"read_time":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Read Time"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Published"},"featured_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Featured Image"},"featured_video":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Featured Video"},"structured_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Structured Data"}},"type":"object","title":"BlogUpdate","description":"Schema for updating a blog post."},"BlogUploadResponse":{"properties":{"file_name":{"type":"string","title":"File Name"},"file_type":{"type":"string","title":"File Type"},"file_size":{"type":"integer","title":"File Size"},"cloudfront_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cloudfront Url"},"s3_url":{"type":"string","title":"S3 Url"},"s3_key":{"type":"string","title":"S3 Key"}},"type":"object","required":["file_name","file_type","file_size","s3_url","s3_key"],"title":"BlogUploadResponse","description":"Response model for file uploads."},"Body_debug_intelligence_run_api_v1_debug_intelligence_run_post":{"properties":{"product_name":{"type":"string","title":"Product Name"},"reviews":{"items":{},"type":"array","title":"Reviews"}},"type":"object","required":["product_name"],"title":"Body_debug_intelligence_run_api_v1_debug_intelligence_run_post"},"Body_import_products_api_v1_b2b_products_import_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_import_products_api_v1_b2b_products_import_post"},"Body_import_score_bank_api_v1_admin_score_bank_import_post":{"properties":{"week":{"type":"string","title":"Week"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["week","file"],"title":"Body_import_score_bank_api_v1_admin_score_bank_import_post"},"Body_ingest_byod_reviews_api_v1_b2b_products__product_id__reviews_byod_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_ingest_byod_reviews_api_v1_b2b_products__product_id__reviews_byod_post"},"Body_issue_token_api_v1_auth_token_post":{"properties":{"grant_type":{"anyOf":[{"type":"string","pattern":"^password$"},{"type":"null"}],"title":"Grant Type"},"username":{"type":"string","title":"Username"},"password":{"type":"string","format":"password","title":"Password"},"scope":{"type":"string","title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"format":"password","title":"Client Secret"}},"type":"object","required":["username","password"],"title":"Body_issue_token_api_v1_auth_token_post"},"Body_run_pipeline_api_v1_b2b_pipeline_run_post":{"properties":{"step":{"type":"string","title":"Step","description":"enrich | normalize | score","default":"enrich"},"product_ids":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Product Ids","description":"specific product IDs; omit for all"}},"type":"object","title":"Body_run_pipeline_api_v1_b2b_pipeline_run_post"},"Body_saml_callback_api_v1_b2b_auth_saml_callback_post":{"properties":{"SAMLResponse":{"type":"string","title":"Samlresponse"}},"type":"object","required":["SAMLResponse"],"title":"Body_saml_callback_api_v1_b2b_auth_saml_callback_post"},"Body_send_test_email_api_v1_admin_email_send_test__template_name__post":{"properties":{"test_email":{"type":"string","format":"email","title":"Test Email","description":"Test email address"},"context":{"additionalProperties":true,"type":"object","title":"Context","description":"Template context variables"}},"type":"object","required":["test_email"],"title":"Body_send_test_email_api_v1_admin_email_send_test__template_name__post"},"Body_upload_blog_attachment_api_v1_blogs__blog_id__upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_blog_attachment_api_v1_blogs__blog_id__upload_post"},"Body_upload_photo_api_v1_profile_upload_photo_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_photo_api_v1_profile_upload_photo_post"},"Body_upload_video_review_api_v1_reviews_upload_video_post":{"properties":{"product_id":{"type":"string","title":"Product Id"},"product_title":{"type":"string","title":"Product Title"},"product_source":{"type":"string","title":"Product Source","default":"google_shopping"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"rating":{"type":"integer","title":"Rating"},"video_file":{"type":"string","contentMediaType":"application/octet-stream","title":"Video File"}},"type":"object","required":["product_id","product_title","title","description","rating","video_file"],"title":"Body_upload_video_review_api_v1_reviews_upload_video_post"},"BrandResponseRequest":{"properties":{"body":{"type":"string","maxLength":4000,"minLength":1,"title":"Body"}},"type":"object","required":["body"],"title":"BrandResponseRequest"},"CalibrationPointIn":{"properties":{"signal_rate":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Signal Rate","description":"Review mention rate (0-1)"},"failure_rate":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Failure Rate","description":"True field failure rate (0-1)"},"defect_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Defect Code","description":"Scope to a defect; null = product-level"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["signal_rate","failure_rate"],"title":"CalibrationPointIn"},"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","description":"Change password request schema."},"CheckoutCallbackRequest":{"properties":{"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["session_id"],"title":"CheckoutCallbackRequest","description":"Request to handle checkout callback."},"ChipFamilyRollupItem":{"properties":{"chip_part_number":{"type":"string","title":"Chip Part Number"},"function_domain":{"type":"string","title":"Function Domain"},"sku_count":{"type":"integer","title":"Sku Count"},"total_component_signal_defects":{"type":"integer","title":"Total Component Signal Defects"},"skus":{"items":{"$ref":"#/components/schemas/ChipFamilySKU"},"type":"array","title":"Skus"}},"type":"object","required":["chip_part_number","function_domain","sku_count","total_component_signal_defects","skus"],"title":"ChipFamilyRollupItem"},"ChipFamilyRollupResponse":{"properties":{"families":{"items":{"$ref":"#/components/schemas/ChipFamilyRollupItem"},"type":"array","title":"Families"}},"type":"object","required":["families"],"title":"ChipFamilyRollupResponse"},"ChipFamilySKU":{"properties":{"product_id":{"type":"string","title":"Product Id"},"name":{"type":"string","title":"Name"},"component_signal_defects":{"type":"integer","title":"Component Signal Defects"},"total_defects":{"type":"integer","title":"Total Defects"}},"type":"object","required":["product_id","name","component_signal_defects","total_defects"],"title":"ChipFamilySKU"},"ClaimInitiateRequest":{"properties":{"slug":{"type":"string","title":"Slug"},"claimant_email":{"type":"string","format":"email","title":"Claimant Email"},"method":{"type":"string","title":"Method","description":"dns | email"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"}},"type":"object","required":["slug","claimant_email","method"],"title":"ClaimInitiateRequest"},"ClaimVerifyRequest":{"properties":{"token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},"type":"object","title":"ClaimVerifyRequest"},"CombinedSummary":{"properties":{"combined_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Combined Summary"},"overall_verdict":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Overall Verdict"},"key_insights":{"items":{"type":"string"},"type":"array","title":"Key Insights","default":[]},"consensus_pros":{"items":{"type":"string"},"type":"array","title":"Consensus Pros","default":[]},"consensus_cons":{"items":{"type":"string"},"type":"array","title":"Consensus Cons","default":[]},"recommendation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recommendation"},"confidence_score":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confidence Score"},"videos_analyzed":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Videos Analyzed"}},"type":"object","title":"CombinedSummary"},"CompareDefect":{"properties":{"category":{"type":"string","title":"Category"},"weight":{"type":"number","title":"Weight"},"severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"},"mentions":{"type":"integer","title":"Mentions","default":0}},"type":"object","required":["category","weight"],"title":"CompareDefect"},"CompareProduct":{"properties":{"product_id":{"type":"string","title":"Product Id"},"asin":{"type":"string","title":"Asin"},"name":{"type":"string","title":"Name"},"role":{"type":"string","title":"Role"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"components":{"additionalProperties":{"type":"number"},"type":"object","title":"Components","default":{}},"top_defects":{"items":{"$ref":"#/components/schemas/CompareDefect"},"type":"array","title":"Top Defects","default":[]}},"type":"object","required":["product_id","asin","name","role"],"title":"CompareProduct"},"CompareRequest":{"properties":{"product_ids":{"items":{"type":"string"},"type":"array","maxItems":5,"minItems":2,"title":"Product Ids"}},"type":"object","required":["product_ids"],"title":"CompareRequest"},"CompareResponse":{"properties":{"products":{"items":{"$ref":"#/components/schemas/CompareProduct"},"type":"array","title":"Products"},"component_winners":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object","title":"Component Winners"},"defect_overlap":{"additionalProperties":{"additionalProperties":{"type":"number"},"type":"object"},"type":"object","title":"Defect Overlap"}},"type":"object","required":["products","component_winners","defect_overlap"],"title":"CompareResponse"},"ComponentBreakdownResponse":{"properties":{"product_id":{"type":"string","title":"Product Id"},"total_defects":{"type":"integer","title":"Total Defects"},"component_signal":{"type":"integer","title":"Component Signal"},"other_component":{"type":"integer","title":"Other Component"},"excluded":{"type":"integer","title":"Excluded"},"unclassified":{"type":"integer","title":"Unclassified"},"by_function":{"items":{"$ref":"#/components/schemas/FunctionBreakdownItem"},"type":"array","title":"By Function"}},"type":"object","required":["product_id","total_defects","component_signal","other_component","excluded","unclassified","by_function"],"title":"ComponentBreakdownResponse"},"ComponentRecord":{"properties":{"function_domain":{"type":"string","title":"Function Domain"},"chip_vendor":{"type":"string","title":"Chip Vendor"},"chip_part_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chip Part Number"},"hardware_revision":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hardware Revision"},"mapping_confidence":{"type":"string","title":"Mapping Confidence"},"mapping_source":{"type":"string","title":"Mapping Source"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["function_domain","chip_vendor","mapping_confidence","mapping_source"],"title":"ComponentRecord"},"ConnectRequest":{"properties":{"access_token":{"type":"string","title":"Access Token"}},"type":"object","required":["access_token"],"title":"ConnectRequest"},"ContactCreate":{"properties":{"name":{"type":"string","title":"Name"},"email":{"type":"string","format":"email","title":"Email"},"subject":{"type":"string","title":"Subject"},"message":{"type":"string","title":"Message"}},"type":"object","required":["name","email","subject","message"],"title":"ContactCreate","description":"Schema for creating a new contact submission.","example":{"email":"john@example.com","message":"I found a bug in the search feature...","name":"John Doe","subject":"Bug Report"}},"ContactResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"email":{"type":"string","title":"Email"},"subject":{"type":"string","title":"Subject"},"message":{"type":"string","title":"Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","email","subject","message","created_at","updated_at"],"title":"ContactResponse","description":"Schema for contact submission response."},"CreateCheckoutSessionRequest":{"properties":{"plan_type":{"type":"string","title":"Plan Type"},"billing_cycle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Cycle","default":"monthly"},"success_url":{"type":"string","title":"Success Url"},"cancel_url":{"type":"string","title":"Cancel Url"}},"type":"object","required":["plan_type","success_url","cancel_url"],"title":"CreateCheckoutSessionRequest","description":"Request to create a checkout session."},"CreatePortalSessionRequest":{"properties":{"return_url":{"type":"string","title":"Return Url"}},"type":"object","required":["return_url"],"title":"CreatePortalSessionRequest","description":"Request to create a billing portal session."},"CreatePriceAlertRequest":{"properties":{"product_id":{"type":"string","title":"Product Id"},"product_name":{"type":"string","title":"Product Name"},"product_url":{"type":"string","title":"Product Url"},"target_price":{"type":"number","exclusiveMinimum":0.0,"title":"Target Price","description":"Target price must be greater than 0"},"current_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Current Price"},"currency":{"type":"string","title":"Currency","default":"usd"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"}},"type":"object","required":["product_id","product_name","product_url","target_price"],"title":"CreatePriceAlertRequest","description":"Request to create a price alert."},"DashboardReferralStatsResponse":{"properties":{"total_referrals":{"type":"integer","title":"Total Referrals"},"purchased_referrals":{"type":"integer","title":"Purchased Referrals"},"savings_earned":{"type":"integer","title":"Savings Earned"}},"type":"object","required":["total_referrals","purchased_referrals","savings_earned"],"title":"DashboardReferralStatsResponse"},"DefectBreakdown":{"properties":{"category":{"type":"string","title":"Category"},"weight":{"type":"number","title":"Weight"},"mentions":{"type":"integer","title":"Mentions"},"lead_time":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lead Time"},"severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"}},"type":"object","required":["category","weight","mentions"],"title":"DefectBreakdown"},"DefectListResponse":{"properties":{"product_id":{"type":"string","title":"Product Id"},"defects":{"items":{"$ref":"#/components/schemas/DefectRecord"},"type":"array","title":"Defects"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["product_id","defects","total","page","page_size"],"title":"DefectListResponse"},"DefectRecord":{"properties":{"id":{"type":"string","title":"Id"},"category":{"type":"string","title":"Category"},"severity":{"type":"string","title":"Severity"},"confidence":{"type":"number","title":"Confidence"},"lead_time_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lead Time Days"},"evidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evidence"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"function_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Function Domain"},"attribution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attribution"},"attribution_confidence":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Attribution Confidence"},"source_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Tier"},"evidence_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evidence Url"}},"type":"object","required":["id","category","severity","confidence","created_at"],"title":"DefectRecord"},"DetailedVerdictRequest":{"properties":{"reviews":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Reviews","description":"All reviews from all sources (community, store, Google Shopping, discussions, SerpAPI)"},"enriched_data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Enriched Data","description":"Full enriched product data. If omitted, backend fetches from Redis cache."}},"type":"object","required":["reviews"],"title":"DetailedVerdictRequest","description":"Request to generate a detailed AI verdict using ALL collected reviews from every source."},"EmailCaptureRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"product_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Name"},"product_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Url"},"imo_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Imo Score"},"verdict":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verdict"},"price":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price"}},"type":"object","required":["email"],"title":"EmailCaptureRequest","description":"Lightweight guest email-capture request (no password) schema."},"EmailCaptureResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"user":{"anyOf":[{"$ref":"#/components/schemas/app__schemas__auth__UserResponse"},{"type":"null"}]},"token":{"anyOf":[{"$ref":"#/components/schemas/TokenResponse"},{"type":"null"}]}},"type":"object","required":["status","message"],"title":"EmailCaptureResponse","description":"Email-capture response. `user`/`token` are only populated for a\nbrand-new profile — an email that already belongs to someone never\ngets logged in on the strength of just typing that address."},"EmailTemplateCreate":{"properties":{"name":{"type":"string","title":"Name","description":"Template name (e.g., 'payment_success')"},"subject":{"type":"string","title":"Subject","description":"Email subject (supports Jinja2 variables)"},"body_html":{"type":"string","title":"Body Html","description":"HTML email body (Jinja2 template)"},"body_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Text","description":"Plain text email body (optional)"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Template description"},"is_active":{"type":"boolean","title":"Is Active","description":"Whether template is active","default":true}},"type":"object","required":["name","subject","body_html"],"title":"EmailTemplateCreate","description":"Schema for creating an email template."},"EmailTemplateResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"subject":{"type":"string","title":"Subject"},"body_html":{"type":"string","title":"Body Html"},"body_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Text"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","name","subject","body_html","body_text","description","is_active","created_at","updated_at"],"title":"EmailTemplateResponse","description":"Schema for email template response."},"EmailTemplateUpdate":{"properties":{"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"body_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Text"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"EmailTemplateUpdate","description":"Schema for updating an email template."},"EnrichedProductRequest":{"properties":{"immersive_api_link":{"type":"string","title":"Immersive Api Link","description":"SerpAPI immersive product API link"}},"type":"object","required":["immersive_api_link"],"title":"EnrichedProductRequest","description":"Request for enriched product details from SerpAPI."},"ExternalReview":{"properties":{"source":{"type":"string","title":"Source"},"author":{"type":"string","title":"Author"},"rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Rating"},"title":{"type":"string","title":"Title"},"content":{"type":"string","title":"Content"}},"type":"object","required":["source","author","title","content"],"title":"ExternalReview","description":"External review from SerpAPI (enrichment)."},"ExtractPreferencesRequest":{"properties":{"agent_id":{"type":"string","title":"Agent Id","description":"Agent identifier (volt, babywise, hearth, ace, trail, sommelier)"},"conversation_history":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Conversation History","description":"List of {\"role\": \"user\"|\"assistant\", \"content\": \"...\"}"}},"type":"object","required":["agent_id","conversation_history"],"title":"ExtractPreferencesRequest","description":"Request to extract preferences from a conversation session."},"ExtractionResultResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"extracted_fields":{"type":"integer","title":"Extracted Fields","default":0},"profile_version":{"type":"integer","title":"Profile Version","default":0},"confidence_level":{"type":"number","title":"Confidence Level","default":0.0},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"}},"type":"object","required":["success"],"title":"ExtractionResultResponse","description":"Response from preference extraction."},"FunctionBreakdownItem":{"properties":{"function_domain":{"type":"string","title":"Function Domain"},"component_signal":{"type":"integer","title":"Component Signal"},"other_component":{"type":"integer","title":"Other Component"},"excluded":{"type":"integer","title":"Excluded"}},"type":"object","required":["function_domain","component_signal","other_component","excluded"],"title":"FunctionBreakdownItem"},"GeolocationResponse":{"properties":{"zipcode":{"type":"string","title":"Zipcode"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"latitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Latitude"},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Longitude"},"source":{"type":"string","title":"Source"}},"type":"object","required":["zipcode","source"],"title":"GeolocationResponse","description":"Response model for geolocation endpoint."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IPAllowlistEntryResponse":{"properties":{"id":{"type":"string","title":"Id"},"cidr":{"type":"string","title":"Cidr"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","cidr","label","created_at"],"title":"IPAllowlistEntryResponse"},"IPAllowlistListResponse":{"properties":{"is_enabled":{"type":"boolean","title":"Is Enabled"},"entries":{"items":{"$ref":"#/components/schemas/IPAllowlistEntryResponse"},"type":"array","title":"Entries"}},"type":"object","required":["is_enabled","entries"],"title":"IPAllowlistListResponse"},"InviteRequest":{"properties":{"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role","default":"analyst"}},"type":"object","required":["email"],"title":"InviteRequest"},"InviteUserRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"role":{"type":"string","title":"Role","default":"analyst"}},"type":"object","required":["email"],"title":"InviteUserRequest"},"IssueResponse":{"properties":{"id":{"type":"string","title":"Id"},"jira_key":{"type":"string","title":"Jira Key"},"summary":{"type":"string","title":"Summary"},"status":{"type":"string","title":"Status"},"priority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Priority"},"is_resolved":{"type":"boolean","title":"Is Resolved"},"product_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Id"},"product_match_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Match Method"},"product_match_confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Product Match Confidence"},"defect_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Defect Category"},"defect_severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Defect Severity"},"resolution_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Type"},"resolution_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Summary"},"time_to_resolve_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Time To Resolve Days"},"jira_created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Jira Created At"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"}},"type":"object","required":["id","jira_key","summary","status","priority","is_resolved","product_id","product_match_method","product_match_confidence","defect_category","defect_severity","resolution_type","resolution_summary","time_to_resolve_days","jira_created_at","resolved_at"],"title":"IssueResponse"},"LogActivityRequest":{"properties":{"activity_type":{"type":"string","title":"Activity Type"},"product_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Id"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"}},"type":"object","required":["activity_type"],"title":"LogActivityRequest"},"MFAConfirmRequest":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"MFAConfirmRequest","description":"Verify a TOTP code to complete setup."},"MFADisableRequest":{"properties":{"password":{"type":"string","title":"Password"},"code":{"type":"string","title":"Code"}},"type":"object","required":["password","code"],"title":"MFADisableRequest","description":"Disable MFA — requires current password + active TOTP code."},"MFASetupResponse":{"properties":{"secret":{"type":"string","title":"Secret"},"qr_code_uri":{"type":"string","title":"Qr Code Uri"},"qr_code_png":{"type":"string","title":"Qr Code Png"},"backup_codes":{"items":{"type":"string"},"type":"array","title":"Backup Codes"}},"type":"object","required":["secret","qr_code_uri","qr_code_png","backup_codes"],"title":"MFASetupResponse","description":"Returned by POST /mfa/setup — contains everything the user needs to enrol."},"MFAVerifyRequest":{"properties":{"mfa_token":{"type":"string","title":"Mfa Token"},"code":{"type":"string","title":"Code"}},"type":"object","required":["mfa_token","code"],"title":"MFAVerifyRequest","description":"Exchange an MFA challenge token + TOTP/backup code for full JWTs."},"NotificationSettingsUpdate":{"properties":{"notify_price_wa":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify Price Wa"},"notify_price_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify Price Email"},"notify_price_min_drop":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Notify Price Min Drop"},"notify_score_wa":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify Score Wa"},"notify_score_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify Score Email"},"digest_frequency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Digest Frequency"},"digest_day":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Digest Day"},"quiet_hours_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Quiet Hours Enabled"}},"type":"object","title":"NotificationSettingsUpdate","description":"Schema for updating notification settings."},"PageContentRequest":{"properties":{"content":{"type":"string","title":"Content"},"url":{"type":"string","title":"Url"}},"type":"object","required":["content","url"],"title":"PageContentRequest","description":"Request model for extracting search query from page content."},"PasswordResetConfirm":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["token","new_password"],"title":"PasswordResetConfirm","description":"Password reset confirmation schema (for confirming reset with token)."},"PasswordResetRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"PasswordResetRequest","description":"Password reset request schema (for requesting reset)."},"PasswordResetResponse":{"properties":{"message":{"type":"string","title":"Message"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","required":["message"],"title":"PasswordResetResponse","description":"Password reset response schema."},"PaymentTransactionResponse":{"properties":{"id":{"type":"string","title":"Id"},"user_id":{"type":"string","title":"User Id"},"subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Id"},"transaction_id":{"type":"string","title":"Transaction Id"},"amount":{"type":"string","title":"Amount"},"currency":{"type":"string","title":"Currency"},"type":{"type":"string","title":"Type"},"status":{"type":"string","title":"Status"},"stripe_payment_intent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Payment Intent Id"},"stripe_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Session Id"},"created_at":{"type":"string","title":"Created At"},"updated_at":{"type":"string","title":"Updated At"}},"type":"object","required":["id","user_id","subscription_id","transaction_id","amount","currency","type","status","stripe_payment_intent_id","stripe_session_id","created_at","updated_at"],"title":"PaymentTransactionResponse","description":"Payment transaction response."},"PortfolioItem":{"properties":{"product_id":{"type":"string","title":"Product Id"},"asin":{"type":"string","title":"Asin"},"name":{"type":"string","title":"Name"},"category":{"type":"string","title":"Category"},"role":{"type":"string","title":"Role"},"status":{"type":"string","title":"Status"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"band":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Band"},"trend":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trend"},"top_defect":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Top Defect"},"total_reviews":{"type":"integer","title":"Total Reviews","default":0},"scored_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scored At"},"reliability_index":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Reliability Index"},"reviews_per_week":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Reviews Per Week"},"weeks_to_signal":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Weeks To Signal"},"detectability_band":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detectability Band"},"score_history":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Score History","default":[]},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"}},"type":"object","required":["product_id","asin","name","category","role","status"],"title":"PortfolioItem"},"PortfolioResponse":{"properties":{"skus":{"items":{"$ref":"#/components/schemas/PortfolioItem"},"type":"array","title":"Skus"},"summary":{"$ref":"#/components/schemas/PortfolioSummary"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["skus","summary","page","page_size"],"title":"PortfolioResponse"},"PortfolioSummary":{"properties":{"total":{"type":"integer","title":"Total"},"scored":{"type":"integer","title":"Scored"},"high_risk":{"type":"integer","title":"High Risk"},"medium_risk":{"type":"integer","title":"Medium Risk"},"low_risk":{"type":"integer","title":"Low Risk"},"minimal_risk":{"type":"integer","title":"Minimal Risk"},"pending":{"type":"integer","title":"Pending"}},"type":"object","required":["total","scored","high_risk","medium_risk","low_risk","minimal_risk","pending"],"title":"PortfolioSummary"},"ProductCacheAIVerdict":{"properties":{"imo_ai_verdict":{"type":"string","title":"Imo Ai Verdict"},"imo_ai_score":{"type":"number","title":"Imo Ai Score"},"pros":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Pros"},"cons":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Cons"},"who_should_buy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Who Should Buy"},"who_should_avoid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Who Should Avoid"},"price_fairness":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price Fairness"},"deal_breakers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Deal Breakers"},"safety_check":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Safety Check"},"score_breakdown":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Score Breakdown"},"score_components":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Score Components"},"absa_scores":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Absa Scores"},"review_integrity_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Integrity Status"},"review_integrity_confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Review Integrity Confidence"},"durability_index":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Durability Index"},"drift_classification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drift Classification"},"failure_inflection_month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Failure Inflection Month"},"defect_cluster_map":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Defect Cluster Map"},"cohort_sentiment":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Cohort Sentiment"},"star_distribution_snapshot":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Star Distribution Snapshot"}},"type":"object","required":["imo_ai_verdict","imo_ai_score"],"title":"ProductCacheAIVerdict","description":"AI verdict data to cache."},"ProductCacheBasicInfo":{"properties":{"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"currency":{"type":"string","title":"Currency","default":"USD"},"price_range_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Range Min"},"price_range_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Range Max"},"imo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imo Url"},"serp_immersive_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Serp Immersive Link"},"stores":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Stores"},"specifications":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Specifications"}},"type":"object","required":["title"],"title":"ProductCacheBasicInfo","description":"Basic product info from SERP API enrichment."},"ProductCacheBatchUpdateRequest":{"properties":{"product_id":{"type":"string","title":"Product Id","description":"Google Shopping product ID from SERP API"},"basic_info":{"anyOf":[{"$ref":"#/components/schemas/ProductCacheBasicInfo"},{"type":"null"}]},"ai_verdict":{"anyOf":[{"$ref":"#/components/schemas/ProductCacheAIVerdict"},{"type":"null"}]},"reviews_data":{"anyOf":[{"$ref":"#/components/schemas/ProductCacheReviews"},{"type":"null"}]},"trust_data":{"anyOf":[{"$ref":"#/components/schemas/ProductCacheTrustAnalysis"},{"type":"null"}]}},"type":"object","required":["product_id"],"title":"ProductCacheBatchUpdateRequest","description":"Request to update multiple parts of product cache at once."},"ProductCacheCreateRequest":{"properties":{"product_id":{"type":"string","title":"Product Id","description":"Google Shopping product ID from SERP API"},"basic_info":{"$ref":"#/components/schemas/ProductCacheBasicInfo"}},"type":"object","required":["product_id","basic_info"],"title":"ProductCacheCreateRequest","description":"Request to create/initialize a product cache entry with basic info."},"ProductCacheResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"product_id":{"type":"string","title":"Product Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"currency":{"type":"string","title":"Currency","default":"USD"},"price_range_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Range Min"},"price_range_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Range Max"},"imo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imo Url"},"serp_immersive_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Serp Immersive Link"},"stores":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Stores"},"specifications":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Specifications"},"imo_ai_verdict":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imo Ai Verdict"},"imo_ai_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Imo Ai Score"},"pros":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Pros"},"cons":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Cons"},"who_should_buy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Who Should Buy"},"who_should_avoid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Who Should Avoid"},"price_fairness":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price Fairness"},"deal_breakers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Deal Breakers"},"safety_check":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Safety Check"},"score_breakdown":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Score Breakdown"},"reviews":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Reviews"},"reviews_count":{"type":"integer","title":"Reviews Count","default":0},"average_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Rating"},"trust_analysis":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Trust Analysis"},"trust_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Trust Score"},"score_components":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Score Components"},"absa_scores":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Absa Scores"},"review_integrity_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Integrity Status"},"review_integrity_confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Review Integrity Confidence"},"durability_index":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Durability Index"},"drift_classification":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Drift Classification"},"failure_inflection_month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Failure Inflection Month"},"defect_cluster_map":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Defect Cluster Map"},"cohort_sentiment":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Cohort Sentiment"},"has_basic_info":{"type":"boolean","title":"Has Basic Info","default":false},"has_ai_verdict":{"type":"boolean","title":"Has Ai Verdict","default":false},"has_reviews":{"type":"boolean","title":"Has Reviews","default":false},"has_trust_analysis":{"type":"boolean","title":"Has Trust Analysis","default":false},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"basic_info_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Basic Info Updated At"},"ai_verdict_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ai Verdict Updated At"},"reviews_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reviews Updated At"},"trust_analysis_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Trust Analysis Updated At"}},"type":"object","required":["id","product_id","title"],"title":"ProductCacheResponse","description":"Response with cached product data."},"ProductCacheReviews":{"properties":{"reviews":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Reviews"},"reviews_count":{"type":"integer","title":"Reviews Count","default":0},"average_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Average Rating"}},"type":"object","required":["reviews"],"title":"ProductCacheReviews","description":"Reviews data to cache."},"ProductCacheStatusResponse":{"properties":{"product_id":{"type":"string","title":"Product Id"},"exists":{"type":"boolean","title":"Exists","default":false},"has_basic_info":{"type":"boolean","title":"Has Basic Info","default":false},"has_ai_verdict":{"type":"boolean","title":"Has Ai Verdict","default":false},"has_reviews":{"type":"boolean","title":"Has Reviews","default":false},"has_trust_analysis":{"type":"boolean","title":"Has Trust Analysis","default":false},"basic_info_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Basic Info Updated At"},"ai_verdict_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ai Verdict Updated At"},"reviews_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reviews Updated At"},"trust_analysis_updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Trust Analysis Updated At"},"cache_age_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cache Age Hours"}},"type":"object","required":["product_id"],"title":"ProductCacheStatusResponse","description":"Response indicating what parts of the cache are available."},"ProductCacheTrustAnalysis":{"properties":{"trust_analysis":{"additionalProperties":true,"type":"object","title":"Trust Analysis"},"trust_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Trust Score"}},"type":"object","required":["trust_analysis"],"title":"ProductCacheTrustAnalysis","description":"Trust analysis data to cache."},"ProductCacheUpdateAIVerdictRequest":{"properties":{"ai_verdict":{"$ref":"#/components/schemas/ProductCacheAIVerdict"}},"type":"object","required":["ai_verdict"],"title":"ProductCacheUpdateAIVerdictRequest","description":"Request to update AI verdict in product cache."},"ProductCacheUpdateReviewsRequest":{"properties":{"reviews_data":{"$ref":"#/components/schemas/ProductCacheReviews"}},"type":"object","required":["reviews_data"],"title":"ProductCacheUpdateReviewsRequest","description":"Request to update reviews in product cache."},"ProductCacheUpdateTrustAnalysisRequest":{"properties":{"trust_data":{"$ref":"#/components/schemas/ProductCacheTrustAnalysis"}},"type":"object","required":["trust_data"],"title":"ProductCacheUpdateTrustAnalysisRequest","description":"Request to update trust analysis in product cache."},"ProductComponentsResponse":{"properties":{"product_id":{"type":"string","title":"Product Id"},"has_broadcom_component":{"type":"boolean","title":"Has Broadcom Component"},"components":{"items":{"$ref":"#/components/schemas/ComponentRecord"},"type":"array","title":"Components"}},"type":"object","required":["product_id","has_broadcom_component","components"],"title":"ProductComponentsResponse"},"ProductCreateRequest":{"properties":{"name":{"type":"string","maxLength":500,"minLength":2,"title":"Name"},"url":{"type":"string","title":"Url","description":"Product page URL (any retailer)"},"category":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Category"},"brand":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Brand"},"price":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price"},"internal_sku_id":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Internal Sku Id"},"role":{"type":"string","title":"Role","description":"hero | competitor","default":"hero"}},"type":"object","required":["name","url"],"title":"ProductCreateRequest","description":"Add a single product to the tenant's portfolio.\n\nOnly ``name`` and ``url`` are required. ``category`` and ``brand`` are\nfilled automatically by the Google-Shopping resolution step during\nenrichment when omitted."},"ProductImportError":{"properties":{"row":{"type":"integer","title":"Row"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["row","reason"],"title":"ProductImportError"},"ProductImportResponse":{"properties":{"accepted":{"type":"integer","title":"Accepted"},"skipped_duplicates":{"type":"integer","title":"Skipped Duplicates"},"rejected":{"type":"integer","title":"Rejected"},"errors":{"items":{"$ref":"#/components/schemas/ProductImportError"},"type":"array","title":"Errors"},"sku_limit_reached":{"type":"boolean","title":"Sku Limit Reached","default":false}},"type":"object","required":["accepted","skipped_duplicates","rejected","errors"],"title":"ProductImportResponse","description":"Result of a CSV bulk import."},"ProductListResponse":{"properties":{"products":{"items":{"$ref":"#/components/schemas/app__schemas__b2b__product__ProductResponse"},"type":"array","title":"Products"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["products","total","page","page_size"],"title":"ProductListResponse"},"ReactionRequest":{"properties":{"product_id":{"type":"string","title":"Product Id"},"reaction":{"type":"string","pattern":"^(up|down)$","title":"Reaction"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"score_card | web_agent"}},"type":"object","required":["product_id","reaction"],"title":"ReactionRequest"},"ReactionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"product_id":{"type":"string","title":"Product Id"},"reaction":{"type":"string","title":"Reaction"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","product_id","reaction","created_at"],"title":"ReactionResponse"},"RefreshTokenRequest":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"RefreshTokenRequest","description":"Refresh token request schema."},"RerankRequest":{"properties":{"agent_id":{"type":"string","title":"Agent Id","default":"volt"},"products":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Products","description":"Products with imo_score and optionally absa_scores"}},"type":"object","required":["products"],"title":"RerankRequest","description":"Request to re-rank a list of products for a user."},"RerankResultResponse":{"properties":{"products":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Products"},"profile_confidence":{"type":"number","title":"Profile Confidence","default":0.0},"applied":{"type":"boolean","title":"Applied","default":false}},"type":"object","required":["products"],"title":"RerankResultResponse","description":"Response from re-ranking."},"ReviewResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"product_id":{"type":"string","format":"uuid","title":"Product Id"},"source":{"type":"string","title":"Source"},"source_review_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Review Id"},"author":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author"},"rating":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Rating"},"review_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Text"},"review_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Title"},"verified_purchase":{"type":"boolean","title":"Verified Purchase"},"helpful_count":{"type":"integer","title":"Helpful Count"},"image_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Image Urls"},"posted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Posted At"},"fetched_at":{"type":"string","format":"date-time","title":"Fetched At"},"sentiment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sentiment"}},"type":"object","required":["id","product_id","source","verified_purchase","helpful_count","fetched_at"],"title":"ReviewResponse","description":"Review response schema."},"ReviewsRequest":{"properties":{"sources":{"items":{"type":"string"},"type":"array","title":"Sources","default":["amazon","reddit","youtube"]},"force_refresh":{"type":"boolean","title":"Force Refresh","default":false}},"type":"object","title":"ReviewsRequest","description":"Fetch reviews request schema."},"ReviewsResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"product_id":{"type":"string","format":"uuid","title":"Product Id"},"total_reviews":{"type":"integer","title":"Total Reviews"},"reviews":{"items":{"$ref":"#/components/schemas/ReviewResponse"},"type":"array","title":"Reviews"}},"type":"object","required":["success","product_id","total_reviews"],"title":"ReviewsResponse","description":"Fetch reviews response schema."},"RoleUpdate":{"properties":{"role":{"type":"string","title":"Role"}},"type":"object","required":["role"],"title":"RoleUpdate"},"SKUScoreHistoryResponse":{"properties":{"product_id":{"type":"string","title":"Product Id"},"points":{"items":{"$ref":"#/components/schemas/ScoreHistoryPoint"},"type":"array","title":"Points"}},"type":"object","required":["product_id","points"],"title":"SKUScoreHistoryResponse"},"SKUScoreResponse":{"properties":{"product_id":{"type":"string","title":"Product Id"},"asin":{"type":"string","title":"Asin"},"name":{"type":"string","title":"Name"},"overall_score":{"type":"number","title":"Overall Score"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"components":{"additionalProperties":{"type":"number"},"type":"object","title":"Components","default":{}},"defect_risk":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Defect Risk"},"band":{"type":"string","title":"Band"},"trend":{"type":"string","title":"Trend"},"confidence_level":{"type":"string","title":"Confidence Level"},"lead_time_estimate":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lead Time Estimate"},"total_reviews":{"type":"integer","title":"Total Reviews"},"defect_review_count":{"type":"integer","title":"Defect Review Count"},"previous_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Previous Score"},"defects":{"items":{"$ref":"#/components/schemas/DefectBreakdown"},"type":"array","title":"Defects"},"scored_at":{"type":"string","format":"date-time","title":"Scored At"},"reliability_index":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Reliability Index"},"reviews_per_week":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Reviews Per Week"},"weeks_to_signal":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Weeks To Signal"},"detectability_band":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detectability Band"},"safety_flag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Safety Flag"},"product_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Status"}},"type":"object","required":["product_id","asin","name","overall_score","band","trend","confidence_level","total_reviews","defect_review_count","defects","scored_at"],"title":"SKUScoreResponse"},"SSOConfigRequest":{"properties":{"provider":{"type":"string","title":"Provider"},"entity_id":{"type":"string","title":"Entity Id"},"sso_url":{"type":"string","title":"Sso Url"},"certificate":{"type":"string","title":"Certificate"},"default_role":{"type":"string","title":"Default Role","default":"analyst"},"jit_provisioning":{"type":"boolean","title":"Jit Provisioning","default":true}},"type":"object","required":["provider","entity_id","sso_url","certificate"],"title":"SSOConfigRequest"},"SSOConfigResponse":{"properties":{"provider":{"type":"string","title":"Provider"},"entity_id":{"type":"string","title":"Entity Id"},"sso_url":{"type":"string","title":"Sso Url"},"default_role":{"type":"string","title":"Default Role"},"jit_provisioning":{"type":"boolean","title":"Jit Provisioning"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["provider","entity_id","sso_url","default_role","jit_provisioning","is_active","created_at","updated_at"],"title":"SSOConfigResponse"},"SavingsBreakdown":{"properties":{"better_alternatives":{"type":"integer","title":"Better Alternatives","default":0},"price_drops":{"type":"integer","title":"Price Drops","default":0},"avoided_purchases":{"type":"integer","title":"Avoided Purchases","default":0}},"type":"object","title":"SavingsBreakdown"},"SavingsOverviewResponse":{"properties":{"total_savings":{"type":"integer","title":"Total Savings"},"milestones_reached":{"items":{"type":"integer"},"type":"array","title":"Milestones Reached"},"next_milestone":{"type":"integer","title":"Next Milestone"},"breakdown":{"$ref":"#/components/schemas/SavingsBreakdown"},"member_since":{"type":"string","format":"date-time","title":"Member Since"}},"type":"object","required":["total_savings","milestones_reached","next_milestone","breakdown","member_since"],"title":"SavingsOverviewResponse"},"ScoreHistoryPoint":{"properties":{"week_start":{"type":"string","format":"date","title":"Week Start"},"score":{"type":"number","title":"Score"}},"type":"object","required":["week_start","score"],"title":"ScoreHistoryPoint"},"SearchRedirectResponse":{"properties":{"redirectUrl":{"type":"string","title":"Redirecturl"},"query":{"type":"string","title":"Query"}},"type":"object","required":["redirectUrl","query"],"title":"SearchRedirectResponse","description":"Response model for search redirect endpoint."},"SearchRequest":{"properties":{"keyword":{"type":"string","title":"Keyword","description":"Search keyword (2-200 characters)"},"zipcode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zipcode","description":"Zipcode for legacy support (not used for SerpAPI geo-targeting)"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"Country for search results (e.g., 'India', 'United States')","default":"United States"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City","description":"City for narrower location targeting (e.g., 'Bengaluru')"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language","description":"Language code for search interface (e.g., 'en', 'hi')","default":"en"},"store":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Store","description":"Preferred store filter (e.g., 'amazon', 'walmart', 'google_shopping', 'home_depot'). If None, returns results from all stores."}},"type":"object","required":["keyword"],"title":"SearchRequest","description":"Search request schema with geo-targeting for SerpAPI."},"SearchResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"keyword":{"type":"string","title":"Keyword"},"zipcode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zipcode"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language"},"store":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Store"},"total_results":{"type":"integer","title":"Total Results"},"results":{"items":{"$ref":"#/components/schemas/app__schemas__ProductResponse"},"type":"array","title":"Results"},"remaining_searches":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remaining Searches"},"search_limit_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search Limit Message"},"prewarm_task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prewarm Task Id"}},"type":"object","required":["success","keyword","zipcode","country","city","language","total_results"],"title":"SearchResponse","description":"Search response schema."},"SectionToggle":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"SectionToggle"},"SectionUpdate":{"properties":{"sections":{"additionalProperties":{"additionalProperties":true,"type":"object"},"type":"object","title":"Sections"}},"type":"object","required":["sections"],"title":"SectionUpdate","description":"Update multiple sections at once."},"SendEmailRequest":{"properties":{"template_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Name","description":"Template name to use (if using template)"},"recipients":{"items":{"type":"string","format":"email"},"type":"array","title":"Recipients","description":"List of recipient email addresses"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject","description":"Email subject (required if not using template)"},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html","description":"HTML body (required if not using template)"},"body_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Text","description":"Plain text body (optional)"},"context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Context","description":"Template context variables"},"recipients_with_names":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Recipients With Names","description":"List of recipients with names: [{'name': 'John Doe', 'email': 'john@example.com'}]"}},"type":"object","required":["recipients"],"title":"SendEmailRequest","description":"Schema for sending an email."},"SendEmailResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"recipients_count":{"type":"integer","title":"Recipients Count"}},"type":"object","required":["success","message","recipients_count"],"title":"SendEmailResponse","description":"Schema for send email response."},"ShortVideoReviewResponse":{"properties":{"id":{"type":"string","title":"Id","description":"Unique video ID"},"platform":{"type":"string","title":"Platform","description":"Platform: 'YouTube Shorts', 'TikTok', or 'Instagram Reels'"},"video_url":{"type":"string","title":"Video Url"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"creator":{"type":"string","title":"Creator"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption"},"likes":{"type":"integer","title":"Likes"},"views":{"type":"integer","title":"Views"},"duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration"}},"type":"object","required":["id","platform","video_url","creator","likes","views"],"title":"ShortVideoReviewResponse","description":"Short-form video review response schema."},"ShortVideoReviewsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"product_id":{"type":"string","title":"Product Id"},"total":{"type":"integer","title":"Total"},"videos":{"items":{"$ref":"#/components/schemas/ShortVideoReviewResponse"},"type":"array","title":"Videos","default":[]}},"type":"object","required":["product_id","total"],"title":"ShortVideoReviewsResponse","description":"Short video reviews collection response."},"SignInRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"SignInRequest","description":"User sign in request schema."},"SignUpRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"full_name":{"type":"string","title":"Full Name"},"ref_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref Id"}},"type":"object","required":["email","password","full_name"],"title":"SignUpRequest","description":"User sign up request schema."},"SocialProofResponse":{"properties":{"product_id":{"type":"string","title":"Product Id"},"combined":{"anyOf":[{"$ref":"#/components/schemas/CombinedSummary"},{"type":"null"}]},"videos":{"items":{"$ref":"#/components/schemas/VideoItem"},"type":"array","title":"Videos","default":[]},"shorts":{"items":{"$ref":"#/components/schemas/VideoItem"},"type":"array","title":"Shorts","default":[]},"fetched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Fetched At"}},"type":"object","required":["product_id"],"title":"SocialProofResponse"},"SubscriptionCreate":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"plan_type":{"type":"string","title":"Plan Type"},"billing_cycle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Cycle"},"is_active":{"type":"boolean","title":"Is Active","default":false},"subscription_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Subscription Start"},"subscription_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Subscription End"},"trial_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Trial Start"},"trial_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Trial End"},"stripe_customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Customer Id"},"stripe_subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Subscription Id"},"stripe_product_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Product Id"}},"type":"object","required":["user_id","plan_type"],"title":"SubscriptionCreate","description":"Create subscription."},"SubscriptionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"plan_type":{"type":"string","title":"Plan Type"},"billing_cycle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Cycle"},"is_active":{"type":"boolean","title":"Is Active"},"subscription_start":{"type":"string","format":"date-time","title":"Subscription Start"},"subscription_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Subscription End"},"trial_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Trial Start"},"trial_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Trial End"},"stripe_customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Customer Id"},"stripe_subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Subscription Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","user_id","plan_type","billing_cycle","is_active","subscription_start","subscription_end","trial_start","trial_end","stripe_customer_id","stripe_subscription_id","created_at","updated_at"],"title":"SubscriptionResponse","description":"Subscription response model."},"SubscriptionUpdate":{"properties":{"plan_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Type"},"billing_cycle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Cycle"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"subscription_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Subscription Start"},"subscription_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Subscription End"},"trial_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Trial Start"},"trial_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Trial End"},"stripe_customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Customer Id"},"stripe_subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Subscription Id"},"stripe_product_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Product Id"}},"type":"object","title":"SubscriptionUpdate","description":"Update subscription."},"SuggestResponse":{"properties":{"anchor_product_id":{"type":"string","title":"Anchor Product Id"},"suggestions":{"items":{"$ref":"#/components/schemas/SuggestedCompetitor"},"type":"array","title":"Suggestions"}},"type":"object","required":["anchor_product_id","suggestions"],"title":"SuggestResponse"},"SuggestedCompetitor":{"properties":{"product_id":{"type":"string","title":"Product Id"},"asin":{"type":"string","title":"Asin"},"name":{"type":"string","title":"Name"},"brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand"},"category":{"type":"string","title":"Category"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"}},"type":"object","required":["product_id","asin","name","category"],"title":"SuggestedCompetitor"},"TenantCreateRequest":{"properties":{"name":{"type":"string","maxLength":200,"minLength":2,"title":"Name"},"slug":{"type":"string","maxLength":50,"minLength":2,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$","title":"Slug"},"owner_email":{"type":"string","format":"email","title":"Owner Email"},"plan":{"type":"string","title":"Plan","default":"trial"},"sku_limit":{"type":"integer","title":"Sku Limit","default":50}},"type":"object","required":["name","slug","owner_email"],"title":"TenantCreateRequest","description":"Used by the internal admin panel to provision a new tenant."},"TenantCreateResponse":{"properties":{"tenant":{"$ref":"#/components/schemas/TenantResponse"},"invite_token":{"type":"string","title":"Invite Token"},"invite_url":{"type":"string","title":"Invite Url"}},"type":"object","required":["tenant","invite_token","invite_url"],"title":"TenantCreateResponse"},"TenantResponse":{"properties":{"id":{"type":"string","title":"Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"plan":{"type":"string","title":"Plan"},"status":{"type":"string","title":"Status"},"sku_limit":{"type":"integer","title":"Sku Limit"},"owner_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Email"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","slug","name","plan","status","sku_limit","created_at"],"title":"TenantResponse"},"TenantSecurityRequest":{"properties":{"mfa_required":{"type":"boolean","title":"Mfa Required"},"mfa_grace_period_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Mfa Grace Period Days","default":7}},"type":"object","required":["mfa_required"],"title":"TenantSecurityRequest","description":"Owner-only: configure tenant-wide MFA policy."},"TenantSecurityResponse":{"properties":{"mfa_required":{"type":"boolean","title":"Mfa Required"},"mfa_grace_period_days":{"type":"integer","title":"Mfa Grace Period Days"}},"type":"object","required":["mfa_required","mfa_grace_period_days"],"title":"TenantSecurityResponse"},"TenantSummary":{"properties":{"id":{"type":"string","title":"Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"plan":{"type":"string","title":"Plan"},"status":{"type":"string","title":"Status"}},"type":"object","required":["id","slug","name","plan","status"],"title":"TenantSummary"},"TenantUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Name"}},"type":"object","title":"TenantUpdateRequest"},"TenantUserListResponse":{"properties":{"users":{"items":{"$ref":"#/components/schemas/TenantUserResponse"},"type":"array","title":"Users"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["users","total"],"title":"TenantUserListResponse"},"TenantUserResponse":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"role":{"type":"string","title":"Role"},"status":{"type":"string","title":"Status"},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","email","role","status","created_at"],"title":"TenantUserResponse"},"TicketResponse":{"properties":{"id":{"type":"string","title":"Id"},"hubspot_ticket_id":{"type":"string","title":"Hubspot Ticket Id"},"subject":{"type":"string","title":"Subject"},"priority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Priority"},"pipeline_stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pipeline Stage"},"is_resolved":{"type":"boolean","title":"Is Resolved"},"product_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Id"},"product_match_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Match Method"},"product_match_confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Product Match Confidence"},"defect_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Defect Category"},"defect_severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Defect Severity"},"resolution_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Type"},"resolution_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Summary"},"time_to_resolve_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Time To Resolve Days"},"hubspot_created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Hubspot Created At"},"closed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Closed At"}},"type":"object","required":["id","hubspot_ticket_id","subject","priority","pipeline_stage","is_resolved","product_id","product_match_method","product_match_confidence","defect_category","defect_severity","resolution_type","resolution_summary","time_to_resolve_days","hubspot_created_at","closed_at"],"title":"TicketResponse"},"ToggleRequest":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"ToggleRequest"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In"}},"type":"object","required":["access_token","refresh_token","expires_in"],"title":"TokenResponse","description":"Token response schema."},"TrackProductRequest":{"properties":{"product_id":{"type":"string","format":"uuid4","title":"Product Id"},"tracked_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Tracked Price"}},"type":"object","required":["product_id"],"title":"TrackProductRequest"},"TrackedProductResponse":{"properties":{"id":{"type":"string","format":"uuid4","title":"Id"},"product_id":{"type":"string","format":"uuid4","title":"Product Id"},"title":{"type":"string","title":"Title"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"original_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Original Price"},"current_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Current Price"},"imo_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Imo Score"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","product_id","title","status","created_at"],"title":"TrackedProductResponse"},"TransactionCreate":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"subscription_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Subscription Id"},"transaction_id":{"type":"string","title":"Transaction Id"},"amount":{"type":"number","title":"Amount"},"currency":{"type":"string","title":"Currency","default":"usd"},"type":{"type":"string","title":"Type"},"status":{"type":"string","title":"Status","default":"pending"},"stripe_payment_intent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Payment Intent Id"},"stripe_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Session Id"},"metadata_json":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metadata Json"}},"type":"object","required":["user_id","transaction_id","amount","type"],"title":"TransactionCreate","description":"Create transaction."},"TransactionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"subscription_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Subscription Id"},"transaction_id":{"type":"string","title":"Transaction Id"},"amount":{"type":"number","title":"Amount"},"currency":{"type":"string","title":"Currency"},"type":{"type":"string","title":"Type"},"status":{"type":"string","title":"Status"},"stripe_payment_intent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Payment Intent Id"},"stripe_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Session Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","user_id","subscription_id","transaction_id","amount","currency","type","status","stripe_payment_intent_id","stripe_session_id","created_at","updated_at"],"title":"TransactionResponse","description":"Transaction response model."},"TransactionUpdate":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount"},"metadata_json":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metadata Json"}},"type":"object","title":"TransactionUpdate","description":"Update transaction."},"UpdatePriceAlertRequest":{"properties":{"target_price":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Target Price"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"UpdatePriceAlertRequest","description":"Request to update a price alert."},"UpdateProfileRequest":{"properties":{"budget_range":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"title":"Budget Range"},"priority_weights":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Priority Weights"},"avoided_brands":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Avoided Brands"},"preferred_brands":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Preferred Brands"},"use_cases":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Use Cases"},"previous_purchases":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Previous Purchases"},"form_factor_preference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Form Factor Preference"},"custom_preferences":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Custom Preferences"}},"type":"object","title":"UpdateProfileRequest","description":"Direct profile update (admin or manual override)."},"UpdateRoleRequest":{"properties":{"role":{"type":"string","title":"Role"}},"type":"object","required":["role"],"title":"UpdateRoleRequest"},"UploadSuccessResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"type":"string","title":"Message","default":"Boom! Your review video just landed in our inbox. Our team's on it—giving it a quick vibe check against our guidelines. Approval usually takes up to 1 business day, and we'll ping you the second it's live."},"review_id":{"type":"string","format":"uuid","title":"Review Id"},"status":{"type":"string","title":"Status","default":"pending"},"guidelines_url":{"type":"string","title":"Guidelines Url","default":"/review-guidelines"}},"type":"object","required":["review_id"],"title":"UploadSuccessResponse","description":"Video upload success response."},"UserUpdate":{"properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"subscription_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Tier"},"access_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Level"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"send_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Send Email","default":false}},"type":"object","title":"UserUpdate","description":"Update user profile."},"UserVideoReviewResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"product_id":{"type":"string","format":"uuid","title":"Product Id"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"rating":{"type":"integer","title":"Rating"},"status":{"type":"string","title":"Status"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"s3_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S3 Key"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","user_id","product_id","title","description","rating","status","created_at","updated_at"],"title":"UserVideoReviewResponse","description":"User video review response schema."},"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"},"VideoItem":{"properties":{"video_id":{"type":"string","title":"Video Id"},"video_type":{"type":"string","title":"Video Type"},"title":{"type":"string","title":"Title"},"link":{"type":"string","title":"Link"},"thumbnail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail"},"channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"duration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Duration"},"published_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published Date"},"snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snippet"},"key_moments":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Key Moments"},"ai_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Summary"},"verdict":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verdict"},"key_points":{"items":{"type":"string"},"type":"array","title":"Key Points","default":[]},"mentions_pros":{"items":{"type":"string"},"type":"array","title":"Mentions Pros","default":[]},"mentions_cons":{"items":{"type":"string"},"type":"array","title":"Mentions Cons","default":[]},"relevance_score":{"anyOf":[{},{"type":"null"}],"title":"Relevance Score"}},"type":"object","required":["video_id","video_type","title","link"],"title":"VideoItem"},"VideoResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"product_id":{"type":"string","format":"uuid","title":"Product Id"},"video_id":{"type":"string","title":"Video Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Name"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration"},"view_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"View Count"},"like_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Like Count"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"fetched_at":{"type":"string","format":"date-time","title":"Fetched At"}},"type":"object","required":["id","product_id","video_id","fetched_at"],"title":"VideoResponse","description":"Video response schema."},"VideosRequest":{"properties":{"force_refresh":{"type":"boolean","title":"Force Refresh","default":false},"min_views":{"type":"integer","minimum":0.0,"title":"Min Views","default":0}},"type":"object","title":"VideosRequest","description":"Fetch videos request schema."},"VideosResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"product_id":{"type":"string","format":"uuid","title":"Product Id"},"total_videos":{"type":"integer","title":"Total Videos"},"videos":{"items":{"$ref":"#/components/schemas/VideoResponse"},"type":"array","title":"Videos"}},"type":"object","required":["success","product_id","total_videos"],"title":"VideosResponse","description":"Fetch videos response schema."},"WebhookCreateRequest":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"events":{"items":{"type":"string"},"type":"array","title":"Events","default":["alert.triggered"]}},"type":"object","required":["url"],"title":"WebhookCreateRequest"},"WebhookCreateResponse":{"properties":{"id":{"type":"string","title":"Id"},"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string"},"type":"array","title":"Events"},"is_active":{"type":"boolean","title":"Is Active"},"failure_count":{"type":"integer","title":"Failure Count"},"last_success_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Success At"},"last_failure_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Failure At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"secret":{"type":"string","title":"Secret"}},"type":"object","required":["id","url","events","is_active","failure_count","last_success_at","last_failure_at","created_at","secret"],"title":"WebhookCreateResponse"},"WebhookDeliveryResponse":{"properties":{"id":{"type":"string","title":"Id"},"event":{"type":"string","title":"Event"},"success":{"type":"boolean","title":"Success"},"response_status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Status"},"response_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Body"},"attempt":{"type":"integer","title":"Attempt"},"delivered_at":{"type":"string","format":"date-time","title":"Delivered At"}},"type":"object","required":["id","event","success","response_status","response_body","attempt","delivered_at"],"title":"WebhookDeliveryResponse"},"WebhookResponse":{"properties":{"id":{"type":"string","title":"Id"},"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string"},"type":"array","title":"Events"},"is_active":{"type":"boolean","title":"Is Active"},"failure_count":{"type":"integer","title":"Failure Count"},"last_success_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Success At"},"last_failure_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Failure At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","url","events","is_active","failure_count","last_success_at","last_failure_at","created_at"],"title":"WebhookResponse"},"app__api__routes__admin_crud__UserResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"type":"string","title":"Full Name"},"subscription_tier":{"type":"string","title":"Subscription Tier"},"access_level":{"type":"string","title":"Access Level"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","email","full_name","subscription_tier","access_level","avatar_url","created_at","updated_at"],"title":"UserResponse","description":"User response model."},"app__api__routes__b2b__ai__ChatMessage":{"properties":{"role":{"type":"string","title":"Role"},"content":{"type":"string","title":"Content"}},"type":"object","required":["role","content"],"title":"ChatMessage"},"app__api__routes__b2b__ai__ChatRequest":{"properties":{"message":{"type":"string","title":"Message"},"history":{"items":{"$ref":"#/components/schemas/app__api__routes__b2b__ai__ChatMessage"},"type":"array","title":"History","default":[]}},"type":"object","required":["message"],"title":"ChatRequest"},"app__api__routes__b2b__ai__ChatResponse":{"properties":{"message":{"type":"string","title":"Message"},"data_type":{"type":"string","title":"Data Type"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data"},"charts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Charts","default":[]},"suggestions":{"items":{"type":"string"},"type":"array","title":"Suggestions","default":[]},"actions":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Actions","default":[]}},"type":"object","required":["message","data_type"],"title":"ChatResponse"},"app__api__routes__b2b__hubspot__ConnectionStatusResponse":{"properties":{"connected":{"type":"boolean","title":"Connected"},"portal_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Portal Id"},"portal_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Portal Name"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"last_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Synced At"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"}},"type":"object","required":["connected"],"title":"ConnectionStatusResponse"},"app__api__routes__b2b__hubspot__MappingCreateRequest":{"properties":{"pipeline_id":{"type":"string","title":"Pipeline Id"},"pipeline_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pipeline Label"},"product_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Id"}},"type":"object","required":["pipeline_id"],"title":"MappingCreateRequest"},"app__api__routes__b2b__hubspot__MappingResponse":{"properties":{"id":{"type":"string","title":"Id"},"product_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Id"},"pipeline_id":{"type":"string","title":"Pipeline Id"},"pipeline_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pipeline Label"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","product_id","pipeline_id","pipeline_label","is_active","created_at"],"title":"MappingResponse"},"app__api__routes__b2b__jira__ConnectionStatusResponse":{"properties":{"connected":{"type":"boolean","title":"Connected"},"site_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Url"},"site_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Name"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"last_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Synced At"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"}},"type":"object","required":["connected"],"title":"ConnectionStatusResponse"},"app__api__routes__b2b__jira__MappingCreateRequest":{"properties":{"jira_project_key":{"type":"string","title":"Jira Project Key"},"component":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Component"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"product_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Id"}},"type":"object","required":["jira_project_key"],"title":"MappingCreateRequest"},"app__api__routes__b2b__jira__MappingResponse":{"properties":{"id":{"type":"string","title":"Id"},"product_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Id"},"jira_project_key":{"type":"string","title":"Jira Project Key"},"component":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Component"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","product_id","jira_project_key","component","label","is_active","created_at"],"title":"MappingResponse"},"app__api__routes__chatbot__ChatMessage":{"properties":{"role":{"type":"string","title":"Role","description":"Message role: 'user' or 'assistant'"},"content":{"type":"string","title":"Content","description":"Message content"}},"type":"object","required":["role","content"],"title":"ChatMessage","description":"Chat message model."},"app__api__routes__chatbot__ChatRequest":{"properties":{"message":{"type":"string","title":"Message","description":"User's message"},"product_title":{"type":"string","title":"Product Title","description":"Product title"},"product_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Description","description":"Product description"},"product_price":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Price","description":"Product price"},"product_rating":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Product Rating","description":"Product rating"},"product_reviews_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Product Reviews Count","description":"Number of reviews"},"ai_verdict":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ai Verdict","description":"AI verdict data"},"conversation_history":{"items":{"$ref":"#/components/schemas/app__api__routes__chatbot__ChatMessage"},"type":"array","title":"Conversation History","description":"Previous messages"}},"type":"object","required":["message","product_title"],"title":"ChatRequest","description":"Request model for chatbot."},"app__api__routes__chatbot__ChatResponse":{"properties":{"message":{"type":"string","title":"Message","description":"AI assistant's response"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if any"}},"type":"object","required":["message"],"title":"ChatResponse","description":"Response model for chatbot."},"app__api__routes__utils__ErrorResponse":{"properties":{"detail":{"type":"string","title":"Detail"}},"type":"object","required":["detail"],"title":"ErrorResponse","description":"Error response model."},"app__schemas__ErrorResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"error":{"type":"string","title":"Error"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"}},"type":"object","required":["error"],"title":"ErrorResponse","description":"Error response schema."},"app__schemas__ProductResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"type":"string","title":"Title"},"source":{"type":"string","title":"Source"},"source_id":{"type":"string","title":"Source Id"},"asin":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asin"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"price":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price"},"currency":{"type":"string","title":"Currency","default":"USD"},"rating":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Rating"},"review_count":{"type":"integer","title":"Review Count"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"availability":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Availability"},"is_detailed_fetched":{"type":"boolean","title":"Is Detailed Fetched","default":false},"reviews_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reviews Summary"},"immersive_product_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Immersive Product Page Token"},"immersive_product_api_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Immersive Product Api Link"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"old_price":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Old Price"},"tag":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag"},"source_icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Icon"},"multiple_sources":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Multiple Sources"},"thumbnails":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Thumbnails"},"delivery":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Delivery"},"bank_offers":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Bank Offers"},"product_details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Product Details"},"about_item":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"About Item"},"bought_together":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Bought Together"},"related_products":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Related Products"},"reviews_insights":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Reviews Insights"},"reviews_images":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Reviews Images"},"customer_reviews_breakdown":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Customer Reviews Breakdown"},"top_reviews":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Top Reviews"}},"type":"object","required":["id","title","source","source_id","review_count"],"title":"ProductResponse","description":"Product response schema."},"app__schemas__auth__UserResponse":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"type":"string","title":"Full Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"subscription_tier":{"type":"string","title":"Subscription Tier"},"access_level":{"type":"string","title":"Access Level"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"oauth_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oauth Provider"},"notify_price_wa":{"type":"boolean","title":"Notify Price Wa","default":true},"notify_price_email":{"type":"boolean","title":"Notify Price Email","default":true},"notify_price_min_drop":{"type":"integer","title":"Notify Price Min Drop","default":5},"notify_score_wa":{"type":"boolean","title":"Notify Score Wa","default":true},"notify_score_email":{"type":"boolean","title":"Notify Score Email","default":false},"digest_frequency":{"type":"string","title":"Digest Frequency","default":"weekly"},"digest_day":{"type":"string","title":"Digest Day","default":"sunday"},"quiet_hours_enabled":{"type":"boolean","title":"Quiet Hours Enabled","default":false}},"type":"object","required":["id","email","full_name","subscription_tier","access_level","roles","created_at"],"title":"UserResponse","description":"User response schema."},"app__schemas__b2b__product__ProductResponse":{"properties":{"product_id":{"type":"string","title":"Product Id"},"asin":{"type":"string","title":"Asin"},"name":{"type":"string","title":"Name"},"brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand"},"category":{"type":"string","title":"Category"},"role":{"type":"string","title":"Role"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"price":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price"},"internal_sku_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Internal Sku Id"},"status":{"type":"string","title":"Status"},"last_enriched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Enriched At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["product_id","asin","name","category","role","status","created_at"],"title":"ProductResponse"}},"securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{"read:products":"Read product scores, verdicts, and product metadata","read:trending":"Read trending product lists","read:profile":"Read the authenticated user's profile","write:reviews":"Submit reviews and feedback"},"tokenUrl":"/api/v1/auth/token"}}},"B2BOAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/api/v1/b2b/auth/login"}}}}}}