{"openapi":"3.1.0","info":{"title":"LapisCore API","description":"Minimal analysis API with analysis-fan-out functionality","version":"1.0.0"},"paths":{"/api/v1/dashboard/company-competitors":{"get":{"tags":["dashboard"],"summary":"Get Company Competitors","description":"Get discovered company competitors for Image product users.\n\nReturns competitors discovered via GPT-5 web search (source='gpt5_direct')\nor via friendvibes during lite signup (source='lite_friendvibes').","operationId":"get_company_competitors_api_v1_dashboard_company_competitors_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Company Competitors Api V1 Dashboard Company Competitors Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dashboard/google-ads-keywords":{"get":{"tags":["dashboard"],"summary":"Get Google Ads Keywords","description":"Get the latest Google Ads keyword plan for the authenticated user.\n\nReturns the full keyword plan including:\n- Brand search campaign (10 exact-match keywords + negatives)\n- Non-brand search campaign (10 exact-match keywords + negatives)\n- Shared negative keywords\n- Company metadata (business_model, geo_target, primary_conversion, etc.)","operationId":"get_google_ads_keywords_api_v1_dashboard_google_ads_keywords_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Google Ads Keywords Api V1 Dashboard Google Ads Keywords Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/oauth/google":{"post":{"tags":["auth","oauth"],"summary":"Google Oauth Login","description":"Handle Google OAuth login.\nOnly allows login for existing accounts.\nReturns 404 if no account exists with the given email.","operationId":"google_oauth_login_api_v1_auth_oauth_google_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleOAuthRequest"}}},"required":true},"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/oauth/google/signup":{"post":{"tags":["auth","oauth"],"summary":"Google Oauth Signup","description":"Handle Google OAuth signup for NEW users only.\nCreates a new account and returns auth token.","operationId":"google_oauth_signup_api_v1_auth_oauth_google_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleOAuthRequest"}}},"required":true},"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/oauth/google/complete":{"post":{"tags":["auth","oauth"],"summary":"Complete Google Oauth Registration","description":"Complete Google OAuth user registration with company/website info.\nFor users who authenticated via Google but need to provide additional details.","operationId":"complete_google_oauth_registration_api_v1_auth_oauth_google_complete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthRegistrationRequest"}}},"required":true},"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/login":{"post":{"tags":["auth"],"summary":"Login","description":"User login with email and password.\nReturns JWT access token and user information.\n\nUses primary database to avoid read replica lag issues,\nespecially for logins immediately after registration.","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"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/me":{"get":{"tags":["auth"],"summary":"Get Current User","description":"Get current authenticated user information.\nStandard REST endpoint used by most authenticated APIs.","operationId":"get_current_user_api_v1_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/check-email":{"post":{"tags":["auth"],"summary":"Check Email","description":"Check if an email is already registered and active.\nReturns status about whether the email can be used for registration.","operationId":"check_email_api_v1_auth_check_email_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Request"}}},"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/auth/send-verification":{"post":{"tags":["auth"],"summary":"Send Verification","description":"Step 1: Send verification code to email.\n\nSends a 6-digit verification code to the provided email address.\n- Code expires in 10 minutes\n- Rate limited to 1 code per email per minute\n- Returns error if email is already registered","operationId":"send_verification_api_v1_auth_send_verification_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendVerificationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendVerificationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/verify-code":{"post":{"tags":["auth"],"summary":"Verify Code","description":"Step 2: Verify the 6-digit code.\n\nValidates the verification code sent to the email.\n- Max 5 failed attempts per code\n- Returns error if code is expired or invalid","operationId":"verify_code_api_v1_auth_verify_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyCodeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/salesdeck/send-verification":{"post":{"tags":["auth"],"summary":"Send Salesdeck Verification","description":"Send a deck access code to a trylapis.com email, including existing users.","operationId":"send_salesdeck_verification_api_v1_auth_salesdeck_send_verification_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendVerificationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendVerificationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/salesdeck/verify-code":{"post":{"tags":["auth"],"summary":"Verify Salesdeck Code","description":"Require the current, unused emailed code before granting deck access.","operationId":"verify_salesdeck_code_api_v1_auth_salesdeck_verify_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyCodeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/complete-registration":{"post":{"tags":["auth"],"summary":"Complete Registration","description":"Step 3: Complete registration after email verification.\n\nCreates user account with verified email and password.\nRequires:\n- email: Verified email address\n- code: The verification code (for security)\n- password: User's chosen password (min 6 chars)\n- full_name: Optional user name\n- company_short_desc: Optional company description\n\nReturns JWT access token and user information.","operationId":"complete_registration_api_v1_auth_complete_registration_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteRegistrationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteRegistrationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/send-phone-verification":{"post":{"tags":["auth"],"summary":"Send Phone Verification","description":"Step 1: Send verification code via WhatsApp.\n\nSends a 6-digit verification code to the provided phone number via WhatsApp.\n- Code expires in 10 minutes\n- Rate limited to 1 code per phone per minute\n- Returns the generated email (user+{phone}@trylapis.com) for use in registration","operationId":"send_phone_verification_api_v1_auth_send_phone_verification_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendPhoneVerificationRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendPhoneVerificationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/verify-phone-code":{"post":{"tags":["auth"],"summary":"Verify Phone Code","description":"Step 2: Verify the phone verification code.\n\nValidates the verification code sent via WhatsApp.\n- Max 5 failed attempts per code\n- Returns the email (user+{phone}@trylapis.com) for use in complete-registration","operationId":"verify_phone_code_api_v1_auth_verify_phone_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyPhoneCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyPhoneCodeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/forgot-password":{"post":{"tags":["auth"],"summary":"Forgot Password","description":"Step 1: Request password reset code.\n\nSends a 6-digit reset code to the provided email address.\n- Code expires in 10 minutes\n- Rate limited to 1 code per email per minute\n- Returns success even if email doesn't exist (security)","operationId":"forgot_password_api_v1_auth_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/verify-reset-code":{"post":{"tags":["auth"],"summary":"Verify Reset Code","description":"Step 2: Verify the 6-digit reset code.\n\nValidates the reset code sent to the email.\n- Max 5 failed attempts per code\n- Returns error if code is expired or invalid\n- Returns a short-lived reset token on success","operationId":"verify_reset_code_api_v1_auth_verify_reset_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyResetCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyResetCodeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/reset-password":{"post":{"tags":["auth"],"summary":"Reset Password","description":"Step 3: Reset password with verified code and token.\n\nResets the user's password after verification.\nRequires:\n- email: Email address\n- code: The 6-digit reset code\n- reset_token: Token from verify-reset-code step\n- new_password: New password (min 6 chars)\n\nReturns success message on completion.","operationId":"reset_password_api_v1_auth_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/register":{"post":{"tags":["auth"],"summary":"Register","description":"User registration (Step 1) - Creates user with email, password, and name.\n\nThis is a simplified registration flow:\n1. POST /auth/register - Create user (email, password, full_name)\n2. PATCH /auth/profile - Add company details (company, company_website)\n\nReturns JWT access token and user information.","operationId":"register_api_v1_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"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/logout":{"post":{"tags":["auth"],"summary":"Logout","description":"User logout.\nIn JWT-based authentication, logout is handled client-side by discarding the token.\nThis endpoint exists for API consistency and potential future token blacklisting.","operationId":"logout_api_v1_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/auth/refresh":{"post":{"tags":["auth"],"summary":"Refresh Token","description":"Refresh access token.\nRequires valid JWT token and returns a new token.","operationId":"refresh_token_api_v1_auth_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/profile":{"patch":{"tags":["auth"],"summary":"Update Profile","description":"Update current user profile (Step 2 of registration).\n\nUse this after registration to add company details:\n- company: Company/organization name\n- company_website: Company website URL (required for ad campaigns)\n\nAlso supports: full_name, role, timezone","operationId":"update_profile_api_v1_auth_profile_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/auth/validate-company-description":{"post":{"tags":["auth"],"summary":"Validate Company Description","description":"Validate that company description is meaningful, not gibberish, and not harmful.\n\nUses:\n1. OpenAI Moderation API to check for harmful/inappropriate content\n2. GPT-4o-mini to check if the description is coherent and meaningful\n\nIf moderation flags ANY category as True, the user should be moved to waitlist.\nThis blocks nefarious businesses (escorts, illegal services, etc.) from using the platform.\n\nThis endpoint does NOT require authentication so it can be used\nduring the onboarding flow before registration is complete.","operationId":"validate_company_description_api_v1_auth_validate_company_description_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateCompanyDescRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateCompanyDescResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notifications/early-access":{"post":{"tags":["notifications"],"summary":"Send Early Access Notification","description":"Send Slack notification for early access signup.\n\nRequires authentication. User info is extracted from the JWT token.\nOnly sends one notification per user per feature (deduplication).\n\nAvailable features:\n- linkedin_deploy: LinkedIn Direct Deploy\n- meta_ads: Meta Ads Campaign Manager\n- google_ads: Google Ads Campaign Manager","operationId":"send_early_access_notification_api_v1_notifications_early_access_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EarlyAccessRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/notifications/early-access/status":{"get":{"tags":["notifications"],"summary":"Get Early Access Status","description":"Check which features the user has signed up for early access.\n\nRequires authentication. Returns status for all three features.","operationId":"get_early_access_status_api_v1_notifications_early_access_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EarlyAccessStatusResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/notifications/walkthrough-status":{"get":{"tags":["notifications"],"summary":"Get Walkthrough Status","description":"Get dashboard walkthrough completion status for current user.","operationId":"get_walkthrough_status_api_v1_notifications_walkthrough_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalkthroughStatusResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/notifications/walkthrough-complete":{"post":{"tags":["notifications"],"summary":"Complete Walkthrough","description":"Mark the dashboard walkthrough as completed for current user.\n\nIdempotent: repeated calls return success without updating timestamps.","operationId":"complete_walkthrough_api_v1_notifications_walkthrough_complete_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/notifications/ads-studio-dismissals":{"get":{"tags":["notifications"],"summary":"Get Ads Studio Dismissal Status","description":"Get Ads Studio dismissal status for current user.\n\nReturns whether each one-time notification has already been dismissed.","operationId":"get_ads_studio_dismissal_status_api_v1_notifications_ads_studio_dismissals_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdsStudioDismissalStatusResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/notifications/ads-studio-dismiss":{"post":{"tags":["notifications"],"summary":"Dismiss Ads Studio Notification","description":"Mark an Ads Studio notification as dismissed for current user.\n\nIdempotent: repeated calls for the same notification return success.","operationId":"dismiss_ads_studio_notification_api_v1_notifications_ads_studio_dismiss_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdsStudioDismissEventRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/notifications/image-download":{"post":{"tags":["notifications"],"summary":"Send Image Download Notification","description":"Send Slack notification for ad image download.\n\nRequires authentication. User info is extracted from the JWT token.\nOnly sends one notification per user + ad + image URL combination (deduplication).","operationId":"send_image_download_notification_api_v1_notifications_image_download_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageDownloadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/notifications/schedule-nudge-email":{"post":{"tags":["notifications"],"summary":"Schedule Nudge Email","description":"Schedule a nudge email to be sent 10 minutes after the user triggers\na credit modal or download gate. The Celery task will re-check subscription\nstatus and once-per-day dedup before actually sending.\n\nValid type values:\n- cart_abandoned: User opened credit/purchase modal but didn't subscribe\n- download_gate: User hit download gate but didn't subscribe","operationId":"schedule_nudge_email_api_v1_notifications_schedule_nudge_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NudgeEmailRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/notifications/email-cta-click":{"post":{"tags":["notifications"],"summary":"Send Email Cta Click Notification","description":"Send Slack notification when user clicks a CTA in an email.\n\nRequires authentication. User info and credits balance are extracted from the database.\nTracks which email type and CTA button triggered the click.\n\nValid email_type values:\n- welcome: Welcome email after first ad campaign\n- one_week_checkin: One week check-in email\n- low_credits: Low credits warning email\n- out_of_credits: Out of credits alert email\n\nValid cta_type values:\n- login: Login button\n- dashboard: Dashboard/See Ads button\n- buy_credits: Buy/Get Credits button\n- campaign_studio: Ad Studio/Create Ads button","operationId":"send_email_cta_click_notification_api_v1_notifications_email_cta_click_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailCTAClickRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/competitors/meta-ads":{"get":{"tags":["competitors"],"summary":"Get All Competitors Meta Ads","description":"Get Meta Ad Library ads for all user's competitors.","operationId":"get_all_competitors_meta_ads_api_v1_competitors_meta_ads_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"country","in":"query","required":false,"schema":{"type":"string","description":"Country filter (e.g., IN, US, ALL)","default":"ALL","title":"Country"},"description":"Country filter (e.g., IN, US, ALL)"},{"name":"ads_per_competitor","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Ads per competitor","default":50,"title":"Ads Per Competitor"},"description":"Ads per competitor"},{"name":"active_status","in":"query","required":false,"schema":{"type":"string","description":"Filter: active, inactive, all","default":"all","title":"Active Status"},"description":"Filter: active, inactive, all"},{"name":"force_refresh","in":"query","required":false,"schema":{"type":"boolean","description":"Force refresh from API (ignores cache)","default":false,"title":"Force Refresh"},"description":"Force refresh from API (ignores cache)"},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllCompetitorsMetaAdsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/competitors/meta-ads/{competitor_name}":{"get":{"tags":["competitors"],"summary":"Get Competitor Meta Ads","description":"Get Meta Ad Library ads for a specific competitor.","operationId":"get_competitor_meta_ads_api_v1_competitors_meta_ads__competitor_name__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"competitor_name","in":"path","required":true,"schema":{"type":"string","title":"Competitor Name"}},{"name":"country","in":"query","required":false,"schema":{"type":"string","description":"Country filter (e.g., IN, US, ALL)","default":"ALL","title":"Country"},"description":"Country filter (e.g., IN, US, ALL)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"Maximum ads to return","default":10,"title":"Limit"},"description":"Maximum ads to return"},{"name":"active_status","in":"query","required":false,"schema":{"type":"string","description":"Filter: active, inactive, all","default":"all","title":"Active Status"},"description":"Filter: active, inactive, all"},{"name":"force_refresh","in":"query","required":false,"schema":{"type":"boolean","description":"Force refresh from API (ignores cache)","default":false,"title":"Force Refresh"},"description":"Force refresh from API (ignores cache)"},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompetitorMetaAdsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/competitors/generate-ad-prompt":{"post":{"tags":["competitors"],"summary":"Generate Competitor Ad Prompt","description":"Generate an ad prompt by analyzing a competitor Meta ad (GPT vision).","operationId":"generate_competitor_ad_prompt_api_v1_competitors_generate_ad_prompt_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateCompetitorAdPromptRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateCompetitorAdPromptResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/competitors/my-ads/auto-discover":{"post":{"tags":["competitors"],"summary":"Auto Discover User Ads","description":"Auto-discover user's Facebook page from their company website and fetch Meta ads.","operationId":"auto_discover_user_ads_api_v1_competitors_my_ads_auto_discover_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"country","in":"query","required":false,"schema":{"type":"string","description":"Country filter (e.g., US, ALL)","default":"ALL","title":"Country"},"description":"Country filter (e.g., US, ALL)"},{"name":"active_status","in":"query","required":false,"schema":{"type":"string","description":"Filter: active, inactive, all","default":"all","title":"Active Status"},"description":"Filter: active, inactive, all"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum ads to return","default":50,"title":"Limit"},"description":"Maximum ads to return"},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOwnAdsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/competitors/my-ads/setup":{"post":{"tags":["competitors"],"summary":"Setup User Own Ads","description":"Set up user's own ads by providing their Facebook page URL.","operationId":"setup_user_own_ads_api_v1_competitors_my_ads_setup_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"country","in":"query","required":false,"schema":{"type":"string","description":"Country filter (e.g., US, ALL)","default":"ALL","title":"Country"},"description":"Country filter (e.g., US, ALL)"},{"name":"active_status","in":"query","required":false,"schema":{"type":"string","description":"Filter: active, inactive, all","default":"all","title":"Active Status"},"description":"Filter: active, inactive, all"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum ads to return","default":50,"title":"Limit"},"description":"Maximum ads to return"},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupUserAdsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOwnAdsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/competitors/my-ads":{"get":{"tags":["competitors"],"summary":"Get User Own Ads","description":"Get user's own Meta ads.","operationId":"get_user_own_ads_api_v1_competitors_my_ads_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"country","in":"query","required":false,"schema":{"type":"string","description":"Country filter (e.g., US, ALL)","default":"ALL","title":"Country"},"description":"Country filter (e.g., US, ALL)"},{"name":"active_status","in":"query","required":false,"schema":{"type":"string","description":"Filter: active, inactive, all","default":"all","title":"Active Status"},"description":"Filter: active, inactive, all"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum ads to return","default":50,"title":"Limit"},"description":"Maximum ads to return"},{"name":"force_refresh","in":"query","required":false,"schema":{"type":"boolean","description":"Force refresh from API","default":false,"title":"Force Refresh"},"description":"Force refresh from API"},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOwnAdsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/competitors/my-ads/generate-template-prompt":{"post":{"tags":["competitors"],"summary":"Generate Template Prompt","description":"Generate a template prompt from Meta ad images + product images (GPT vision).","operationId":"generate_template_prompt_api_v1_competitors_my_ads_generate_template_prompt_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateTemplatePromptRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateCompetitorAdPromptResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/competitors/discover":{"post":{"tags":["competitors"],"summary":"Discover Competitors","description":"Discover competitors for a company website.\n\nUses GPT-5 with web search to identify direct competitors.\nRequires authentication - competitors are stored for the authenticated user.\n\n**Modes:**\n- `async_mode=true` (default): Returns immediately with task_id, poll `/status/{task_id}` for results\n- `async_mode=false`: Waits for completion and returns competitors directly (may take 30-60s)\n\n**Returns:** 10-15 direct competitors with websites and descriptions.","operationId":"discover_competitors_api_v1_competitors_discover_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompetitorDiscoverRequest"}}}},"responses":{"200":{"description":"Sync response with competitors","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/CompetitorDiscoverResponse"},{"$ref":"#/components/schemas/AsyncTaskResponse"}],"title":"Response Discover Competitors Api V1 Competitors Discover Post","$ref":"#/components/schemas/CompetitorDiscoverResponse"}}}},"202":{"description":"Async task started","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsyncTaskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/competitors/discovery-status":{"get":{"tags":["competitors"],"summary":"Get Discovery Status","description":"Check if the current user has discovered competitors.\n\nReturns status of competitor discovery for the authenticated user.\nChecks both GPT-5 direct discovery (pro) and lite_friendvibes (lite) sources.\nUse this to show loading states or prompt user to wait for discovery.","operationId":"get_discovery_status_api_v1_competitors_discovery_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoveryStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev-auth/login":{"post":{"tags":["dev-auth"],"summary":"Dev Login","description":"Login as a dev user. Returns JWT access token and user info.","operationId":"dev_login_api_v1_dev_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevUserLoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevAuthResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev-auth/create":{"post":{"tags":["dev-auth"],"summary":"Create Dev User","description":"Create a new dev user. Requires X-Dev-Token header.","operationId":"create_dev_user_api_v1_dev_auth_create_post","parameters":[{"name":"X-Dev-Token","in":"header","required":true,"schema":{"type":"string","title":"X-Dev-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevUserCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevUserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev-auth/me":{"get":{"tags":["dev-auth"],"summary":"Get Me","description":"Get the current authenticated dev user.","operationId":"get_me_api_v1_dev_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevUserResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/dev/change-user-password":{"post":{"tags":["dev"],"summary":"Change User Password","description":"Change a user's password (dev-only endpoint).\n\nThis endpoint requires X-Lapis-Dev-Token header for authentication.\n\nIt will:\n1. Look up the user by email\n2. Hash the new password using the same method as user signup (bcrypt)\n3. Update the user's password in the database\n\nArgs:\n    request: User email and new password\n    db: Database session\n\nReturns:\n    Status message confirming password change\n\nExample:\n    POST /api/v1/dev/change-user-password\n    Headers: X-Lapis-Dev-Token: <token>\n    Body: {\n        \"email\": \"user@example.com\",\n        \"new_password\": \"newpassword123\"\n    }","operationId":"change_user_password_api_v1_dev_change_user_password_post","parameters":[{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeUserPasswordRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeUserPasswordResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/grant-daily-credits":{"post":{"tags":["dev"],"summary":"Grant Daily Credits","description":"Grant daily credits to all active users.\n\nCalled by LapisCRON daily to give all users free credits.\nSends a Slack notification with the report.","operationId":"grant_daily_credits_api_v1_dev_grant_daily_credits_post","parameters":[{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantDailyCreditsRequest","default":{"credits_amount":5}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantDailyCreditsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/grant-new-signup-credits":{"post":{"tags":["dev"],"summary":"Grant New Signup Credits","description":"Grant 5 credits to non-AppSumo users who signed up yesterday (IST) and ran out of credits.\n\nDesigned to be called by LapisCRON at 9AM IST daily.\n\nFinds users where:\n- created_at was yesterday (IST / UTC+5:30)\n- current credit balance is 0\n- NOT linked to an active AppSumo license\n- NOT a member of an AppSumo team","operationId":"grant_new_signup_credits_api_v1_dev_grant_new_signup_credits_post","parameters":[{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantNewSignupCreditsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/appsumo-monthly-topup":{"post":{"tags":["dev"],"summary":"Appsumo Monthly Topup","description":"Grant monthly credit top-ups to all active AppSumo license holders.\n\nCalled by LapisCRON monthly. Credits are based on license tier:\n- Silver (tier 1): APPSUMO_MONTHLY_CREDITS_SILVER\n- Gold (tier 2): APPSUMO_MONTHLY_CREDITS_GOLD\n- Platinum (tier 3): APPSUMO_MONTHLY_CREDITS_PLATINUM\n\nDeduplicates by checking if a 'appsumo_monthly_topup' credit transaction\nalready exists for the user in the current calendar month.","operationId":"appsumo_monthly_topup_api_v1_dev_appsumo_monthly_topup_post","parameters":[{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppSumoMonthlyTopupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/subscription-renewal-cron":{"post":{"tags":["dev"],"summary":"Subscription Renewal Cron","description":"Daily cron: process all due AppSumo subscription renewals.\n\nGrants monthly credits on each user's signup anniversary date.\nRenewal dates are computed from users.created_at.\n\nStripe renewals are NOT processed here — they are handled\nexclusively by the invoice.payment_succeeded webhook to ensure\ncredits are only granted after confirmed payment.\n\nRobustness / ordering: every license is processed in its own savepoint\nand committed individually, so one bad record (or one bad pooled DB\nconnection) is counted in ``appsumo_failed`` instead of failing the run.\nDeduplicates via the subscription_renewals table, so it is idempotent and\nmay be re-run any time later the same day; its position in the LapisCRON\nschedule (e.g. right after the nightly backup dispatch) does not matter.\n\nCalled by LapisCRON or manually via dev_scripts.","operationId":"subscription_renewal_cron_api_v1_dev_subscription_renewal_cron_post","parameters":[{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenewalCronResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/toggle-chatgpt-ads":{"post":{"tags":["dev"],"summary":"Toggle Chatgpt Ads","description":"Enable or disable ChatGPT Ads for a specific user.\n\nOptionally pass account_id to register the OpenAI Ads account\nfor the automated daily pipeline (download → analyze → report → email).\n\nRequires X-Lapis-Dev-Token header.","operationId":"toggle_chatgpt_ads_api_v1_dev_toggle_chatgpt_ads_post","parameters":[{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToggleChatGPTAdsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToggleChatGPTAdsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/invalidate-account":{"post":{"tags":["dev"],"summary":"Invalidate Account","description":"Invalidate a user account (dev-only endpoint).\n\nPrefixes the user's email with `invalidate_` and sets `is_active=False`,\npreventing further logins while preserving the user record for audit.\n\nIdempotent: retrying with either the original email or the already-\nprefixed form resolves to the same record and ensures `is_active=False`.\n\nSafety guard: if the user has a Stripe subscription that is neither\ncancelled nor paused (via `pause_collection`), the request is rejected\nwith 409 so the caller explicitly pauses or cancels billing first.","operationId":"invalidate_account_api_v1_dev_invalidate_account_post","parameters":[{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidateAccountRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvalidateAccountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/pause-stripe-subscription":{"post":{"tags":["dev"],"summary":"Pause Stripe Subscription","description":"Pause a user's monthly Stripe subscription (dev-only endpoint).\n\nCalls `stripe.Subscription.modify` with `pause_collection` to suspend\ninvoice generation without cancelling the subscription.\n\nMarks `paid_users.stripe_payment_status` as `\"paused\"` so the user\nimmediately loses paid access and shows as \"Free\" in the app. This is\nsafe because `handle_subscription_updated` also maps a subscription with\n`pause_collection` set to `\"paused\"`, so the webhook keeps the local\nmarker in sync rather than overwriting it back to `\"active\"`.\n\nTo resume, clear `pause_collection` via the Stripe API — Stripe then\nfires `customer.subscription.updated` with status `\"active\"`, which\nrestores the `\"active\"` marker and paid access.","operationId":"pause_stripe_subscription_api_v1_dev_pause_stripe_subscription_post","parameters":[{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PauseStripeSubscriptionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PauseStripeSubscriptionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/grant-credits":{"post":{"tags":["dev"],"summary":"Grant Credits","description":"Grant credits to a user (dev-only endpoint).\n\nUses ``credit_service.add_reward_credits`` so the grant is recorded as an\nADJUSTMENT transaction in ``credit_transactions`` — keeping an auditable\ntrail of who/when/why, rather than silently mutating ``user_credits.balance``.\n\nExample:\n    POST /api/v1/dev/grant-credits\n    Headers: X-Lapis-Dev-Token: <token>\n    Body: { \"email\": \"user@example.com\", \"amount\": 50, \"reason\": \"support comp\" }","operationId":"grant_credits_api_v1_dev_grant_credits_post","parameters":[{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantCreditsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantCreditsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/backup-database":{"post":{"tags":["dev"],"summary":"Backup Database","description":"Dispatch a full database backup to S3 via Celery.\n\nReturns immediately with a task_id. The Celery worker runs pg_dump\nand uploads the dump to S3 via boto3.","operationId":"backup_database_api_v1_dev_backup_database_post","parameters":[{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackupDatabaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/prune-old-rows":{"post":{"tags":["dev"],"summary":"Prune Old Rows","description":"Dispatch nightly row retention (llm_calls / pixel_events) via Celery.\n\nSchedule this from LapisCRON *after* /backup-database so the dump always\ncontains the rows about to be pruned. Windows are configured by\nLLM_CALLS_RETENTION_DAYS / PIXEL_EVENTS_RETENTION_DAYS.","operationId":"prune_old_rows_api_v1_dev_prune_old_rows_post","parameters":[{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackupDatabaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/tracing/search":{"get":{"tags":["dev-tracing"],"summary":"Search Customer Records","description":"Search users/companies, conversation text and generated image prompts.\n\nCase-insensitive literal substring search. User/company matches also return\nthat user's conversations and images. Results are newest first, paginated\nacross all requested sources. Images are searched by stored text, not pixels.\nDetail URLs require the same developer token as this endpoint.","operationId":"search_customer_records_api_v1_dev_tracing_search_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":200,"default":"","title":"Q"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"enum":["user","conversation","image"],"type":"string"},{"type":"null"}],"title":"Kind"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":1},{"type":"null"}],"title":"User Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/tracing/content-sessions/{session_id}":{"get":{"tags":["dev-tracing"],"summary":"Get Content Conversation","description":"Open the complete persisted content-agent conversation from a search hit.","operationId":"get_content_conversation_api_v1_dev_tracing_content_sessions__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/tracing/image-conversations/{session_id}":{"get":{"tags":["dev-tracing"],"summary":"Get Image Conversation","description":"Customer-facing message history without loading full LLM/tool traces.","operationId":"get_image_conversation_api_v1_dev_tracing_image_conversations__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/tracing/users/search":{"get":{"tags":["dev-tracing"],"summary":"Search Users","description":"Search for users by email (partial) or user ID.","operationId":"search_users_api_v1_dev_tracing_users_search_get","parameters":[{"name":"email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Partial email match","title":"Email"},"description":"Partial email match"},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Exact user ID","title":"User Id"},"description":"Exact user ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevUserSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/tracing/users/{user_id}":{"get":{"tags":["dev-tracing"],"summary":"Get User Detail","description":"Get user profile with agent session counts.","operationId":"get_user_detail_api_v1_dev_tracing_users__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevUserDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/tracing/users/{user_id}/sessions":{"get":{"tags":["dev-tracing"],"summary":"List User Sessions","description":"List all Image Agent sessions for a user.","operationId":"list_user_sessions_api_v1_dev_tracing_users__user_id__sessions_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"active, completed, archived","title":"Status"},"description":"active, completed, archived"},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevSessionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/tracing/agent-sessions/{session_id}/trace":{"get":{"tags":["dev-tracing"],"summary":"Get Agent Session Trace","description":"Get the comprehensive trace for an Image Agent session.\n\nReturns the full timeline: every LLM call (with complete system prompt,\nconversation messages, and tool call decisions), every tool execution\n(with raw args, results, and creative prompts), and every user/assistant\nmessage — all sorted chronologically.\n\nThis is the primary endpoint for understanding the complete ReAct flow:\nuser message → LLM reasoning → tool decision → tool execution → LLM observes result → ...","operationId":"get_agent_session_trace_api_v1_dev_tracing_agent_sessions__session_id__trace_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}},{"name":"include_tool_results","in":"query","required":false,"schema":{"type":"boolean","description":"Include tool_result JSONB (can be large)","default":true,"title":"Include Tool Results"},"description":"Include tool_result JSONB (can be large)"},{"name":"include_conversation_messages","in":"query","required":false,"schema":{"type":"boolean","description":"Include full conversation array from LLM calls","default":true,"title":"Include Conversation Messages"},"description":"Include full conversation array from LLM calls"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevAgentSessionTrace"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/tracing/agent-sessions/{session_id}/tool-executions":{"get":{"tags":["dev-tracing"],"summary":"List Session Tool Executions","description":"List all tool executions for a session with full raw args/results.","operationId":"list_session_tool_executions_api_v1_dev_tracing_agent_sessions__session_id__tool_executions_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}},{"name":"tool_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tool name","title":"Tool Name"},"description":"Filter by tool name"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"pending, success, error","title":"Status"},"description":"pending, success, error"},{"name":"include_tool_results","in":"query","required":false,"schema":{"type":"boolean","description":"Include tool_result JSONB","default":true,"title":"Include Tool Results"},"description":"Include tool_result JSONB"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevToolExecutionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/tracing/agent-sessions/{session_id}/llm-calls":{"get":{"tags":["dev-tracing"],"summary":"List Session Llm Calls","description":"List all LLM calls for a session — the exact prompts sent and responses received.\n\nShows every ReAct reasoning call (image_agent.reasoning) and every creative\nprompt generation call, with the full system prompt, conversation messages,\nLLM response, and tool call decisions.","operationId":"list_session_llm_calls_api_v1_dev_tracing_agent_sessions__session_id__llm_calls_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}},{"name":"include_conversation_messages","in":"query","required":false,"schema":{"type":"boolean","description":"Include full conversation array","default":true,"title":"Include Conversation Messages"},"description":"Include full conversation array"},{"name":"include_system_prompt","in":"query","required":false,"schema":{"type":"boolean","description":"Include full system prompt text","default":true,"title":"Include System Prompt"},"description":"Include full system prompt text"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevLLMCallListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/tracing/sessions/search":{"get":{"tags":["dev-tracing"],"summary":"Search Sessions","description":"Search across all Image Agent sessions with filters.","operationId":"search_sessions_api_v1_dev_tracing_sessions_search_get","parameters":[{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date To"}},{"name":"tool_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sessions that used this tool","title":"Tool Name"},"description":"Sessions that used this tool"},{"name":"has_errors","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Sessions with errored tool executions","title":"Has Errors"},"description":"Sessions with errored tool executions"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevSessionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dev/tracing/tool-executions/{execution_id}":{"get":{"tags":["dev-tracing"],"summary":"Get Tool Execution","description":"Get a single tool execution with full raw data.","operationId":"get_tool_execution_api_v1_dev_tracing_tool_executions__execution_id__get","parameters":[{"name":"execution_id","in":"path","required":true,"schema":{"type":"integer","title":"Execution Id"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevToolExecutionDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/brand-profile":{"get":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Get Brand Profile","description":"Fast brand profile endpoint. Returns only core brand data.","operationId":"get_brand_profile_api_v1_ad_campaigns_brand_profile_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/brand-profile/colors":{"put":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Update Brand Profile Colors","description":"Update the saved brand color palette for the current user's latest brand.","operationId":"update_brand_profile_colors_api_v1_ad_campaigns_brand_profile_colors_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandColorsUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/status":{"get":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Check Ad Campaigns Status","description":"Get the status of the latest company profile for the user.\n\nReturns:\n- profile_id: ID of the latest profile (if exists)\n- status: Current status from CompanyProfileStatus enum, or \"none\" if no profile exists\n- saphire_website_id: The Saphire website ID for fetching brand assets (if available)","operationId":"check_ad_campaigns_status_api_v1_ad_campaigns_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-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/ad-campaigns/create-profile":{"post":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Create Profile","description":"Create a new company profile and Saphire website record (without crawling).\n\nUse this endpoint when you want to upload manual reference images instead\nof crawling the website for brand assets.\n\nThis endpoint:\n1. Creates a Saphire website record (or finds existing)\n2. Creates/updates local SaphireWebsite record\n3. Creates a CompanyProfile linked to the Saphire website\n\nAfter creating the profile, upload manual references via the\n/manual-reference-images endpoints and start ad campaign generation via\nPOST /generate.\n\nRequirements:\n- User must have a company_website set in their profile\n\nResponse:\n- profile_id: ID of the newly created profile\n- status: 'pending'\n- message: Confirmation message","operationId":"create_profile_api_v1_ad_campaigns_create_profile_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateAdCampaignStartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/create-profile-and-start-saphire-crawl":{"post":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Create Profile And Start Saphire Crawl","description":"Create a new company profile and trigger Saphire web crawl.\n\nThis endpoint:\n1. Creates a new CompanyProfile with status 'pending'\n2. Triggers the Saphire crawl task asynchronously\n3. Returns immediately with the profile_id\n\nWhen the crawl completes successfully, the profile status will be\nautomatically updated to 'brand_assets_generated'.\n\nRequirements:\n- User must have a company_website set in their profile\n\nResponse:\n- profile_id: ID of the newly created profile\n- status: 'pending'\n- message: Confirmation message\n\nUse GET /ad-campaigns/status to poll for crawl completion.","operationId":"create_profile_and_start_saphire_crawl_api_v1_ad_campaigns_create_profile_and_start_saphire_crawl_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateAdCampaignStartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/create-profile-from-instagram":{"post":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Create Profile From Instagram","description":"Start Instagram profile processing for an IG-signup user.\n\nTriggers a Celery task that:\n1. Fetches the Instagram profile via SearchAPI\n2. Downloads avatar + post images to S3\n3. Creates SaphireBrandAssets and ManualReferenceUpload records\n4. Sets user.company_website (to external link or IG URL)\n5. If external website found, chains into crawl_website_saphire\n\nAfter this completes, the frontend should follow the normal pro flow:\ncreate-profile-and-start-saphire-crawl -> /generate","operationId":"create_profile_from_instagram_api_v1_ad_campaigns_create_profile_from_instagram_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-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/ad-campaigns/fast-crawl":{"post":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Fast Crawl Website","description":"Ultra-fast crawl to extract logo and screenshots from a website.\n\nThis endpoint uses Firecrawl v2 for single-page scraping and returns\nS3 URLs for the logo and screenshots in ~5-15 seconds.\n\nPerfect for onboarding flows where you want to auto-detect brand assets\nwithout making the user wait for a full crawl.\n\nRequest body:\n- website_url: URL of the website to crawl\n\nResponse:\n- website_id: Saphire website ID\n- logo_url: S3 URL of the primary logo (if found)\n- screenshot_urls: List of S3 URLs for homepage screenshots\n- logos_found: Number of logos extracted\n- screenshots_captured: Number of screenshots taken\n- elapsed_seconds: Time taken\n- message: Status message","operationId":"fast_crawl_website_api_v1_ad_campaigns_fast_crawl_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FastCrawlRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FastCrawlResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/crawl/status":{"get":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Poll Saphire Crawl Status","description":"Poll the status of Saphire crawl / brand asset generation.\n\nReturns:\n- When in progress: profile_id, status='pending', completed=false\n- When completed: profile_id, status='brand_assets_generated', completed=true\n- When failed: profile_id, status='failed', completed=true, error_message\n\nPoll this endpoint until completed=true.","operationId":"poll_saphire_crawl_status_api_v1_ad_campaigns_crawl_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateAdCampaignStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/generate":{"post":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Generate Ad Campaign Async","description":"Start ad campaign generation asynchronously (non-blocking).\n\nThis endpoint starts the Celery task chain and returns immediately with the profile_id.\nUse GET /ad-campaigns/generate/status to poll for completion.\n\nRequirements:\n- User must have a company_website set in their profile\n- User must have a CompanyProfile with status 'brand_assets_verified'\n\n**Credits:** Consumes 1 credit per campaign.","operationId":"generate_ad_campaign_async_api_v1_ad_campaigns_generate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"num_campaigns","in":"query","required":false,"schema":{"type":"integer","maximum":10,"minimum":1,"description":"Number of campaigns to generate (1-10), selecting top personas by audience size","default":5,"title":"Num Campaigns"},"description":"Number of campaigns to generate (1-10), selecting top personas by audience size"},{"name":"generate_images","in":"query","required":false,"schema":{"type":"boolean","description":"Whether to generate ad images as part of the pipeline","default":true,"title":"Generate Images"},"description":"Whether to generate ad images as part of the pipeline"},{"name":"generate_forecasts","in":"query","required":false,"schema":{"type":"boolean","description":"Reserved for future forecast controls","default":true,"title":"Generate Forecasts"},"description":"Reserved for future forecast controls"},{"name":"use_manual_references","in":"query","required":false,"schema":{"type":"boolean","description":"Reserved for future manual-reference controls","default":true,"title":"Use Manual References"},"description":"Reserved for future manual-reference controls"},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateAdCampaignStartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/generate/status":{"get":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Poll Ad Campaign Generation","description":"Poll the status of ad campaign generation.\n\nReturns:\n- When in progress: profile_id, status, completed=false, message\n- When completed: profile_id, status='ad_campaign_created', completed=true, full company_profile\n- When failed: profile_id, status='failed', completed=true, error_message\n\nPoll this endpoint until completed=true, then use the company_profile data.","operationId":"poll_ad_campaign_generation_api_v1_ad_campaigns_generate_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateAdCampaignStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/full":{"get":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Get Full Company Profile Data","description":"Get full company profile data with Saphire AI images.\n\nThis endpoint runs a full pipeline:\n1. Crawls the website with Saphire to extract brand assets (or uses cached)\n2. Runs company profile generation (includes company research in step1)\n3. Generates creative images for each ad using Saphire AI\n\nIf either task already has completed data, it will be returned.\nIf either task fails, the other's results are still returned (partial success).\nImage/forecast generation failures don't fail the overall operation - campaigns are still returned.\n\nNote: This endpoint may take several minutes to respond if generation is triggered.\n\nQuery Parameters:\n- force_regenerate: If True, generates new data even if existing data exists\n\nRequirements:\n- User must have a company_website set in their profile\n\nResponse:\n- success: True if generation succeeded\n- was_existing: True if returning existing data\n- company_profile: Full profile data with company research, creative images and forecasts\n- company_profile_error: Error message (if failed)\n- saphire_error: Saphire crawl/image generation error (if any)\n- image_stats: Statistics about image generation\n- forecast_stats: Statistics about forecast generation\n- forecast_error: Forecast generation error (if any)","operationId":"get_full_company_profile_data_api_v1_ad_campaigns_full_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"force_regenerate","in":"query","required":false,"schema":{"type":"boolean","description":"Force generation of new profile even if existing one exists","default":false,"title":"Force Regenerate"},"description":"Force generation of new profile even if existing one exists"},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CombinedCompanyProfileResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/manual-references":{"post":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Upload Manual Reference Images","description":"Upload manual reference images for the latest Saphire website.","operationId":"upload_manual_reference_images_api_v1_ad_campaigns_manual_references_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualReferenceUploadRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualReferenceUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Get Manual Reference Images","description":"List manual reference images for the latest Saphire website.","operationId":"get_manual_reference_images_api_v1_ad_campaigns_manual_references_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualReferenceListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/manual-references/logo":{"put":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Replace Logo","description":"Replace or add the brand logo without affecting style reference images.","operationId":"replace_logo_api_v1_ad_campaigns_manual_references_logo_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplaceLogoRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplaceLogoResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/manual-references/style-reference":{"post":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Add Style Reference","description":"Add a single style reference image without affecting existing references or the logo.","operationId":"add_style_reference_api_v1_ad_campaigns_manual_references_style_reference_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddStyleReferenceRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddStyleReferenceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/manual-references/{reference_id}":{"delete":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Delete Single Reference","description":"Delete a single style reference image by ID. Cannot delete the logo.","operationId":"delete_single_reference_api_v1_ad_campaigns_manual_references__reference_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"reference_id","in":"path","required":true,"schema":{"type":"integer","title":"Reference Id"}},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/manual-reference-images/{job_id}/status":{"get":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Get Manual Reference Image Status","description":"Get status for a manual-reference async image generation job.\n\nWhen the job completes, the generation history record is automatically updated\nwith the S3 URL and generation details.","operationId":"get_manual_reference_image_status_api_v1_ad_campaigns_manual_reference_images__job_id__status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaphireImageGenerationStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/manual-reference-images/history":{"get":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Get Manual Reference Generation History","description":"Get history of all manual reference image generations.\n\nReturns all generations for the user's latest Saphire website,\nordered by creation date (newest first).\n\nOnly stores S3 URLs (no base64 data) to keep responses lightweight.\n\nQuery Parameters:\n- limit: Maximum number of records (default: 50, max: 100)\n- offset: Number of records to skip for pagination","operationId":"get_manual_reference_generation_history_api_v1_ad_campaigns_manual_reference_images_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum number of records to return","default":50,"title":"Limit"},"description":"Maximum number of records to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Number of records to skip","default":0,"title":"Offset"},"description":"Number of records to skip"},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualReferenceGenerationHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/ads/{ad_id}":{"get":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Get Ad","description":"Get a single AdCampaignAd by ID.\n\nReturns the ad details including headline, intro_text, creative_prompt,\nand creative image information.\n\nThe user must own the ad (via AdCampaign -> CompanyProfile).","operationId":"get_ad_api_v1_ad_campaigns_ads__ad_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ad_id","in":"path","required":true,"schema":{"type":"integer","title":"Ad Id"}},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdCampaignAdResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/ads/{ad_id}/images":{"get":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Get Ad Images","description":"Get all Saphire images associated with an ad.\n\nReturns images sorted by newest first (descending by created_at).\nThis provides the full image history for an ad.","operationId":"get_ad_images_api_v1_ad_campaigns_ads__ad_id__images_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ad_id","in":"path","required":true,"schema":{"type":"integer","title":"Ad Id"}},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SaphireImageResponse"},"title":"Response Get Ad Images Api V1 Ad Campaigns Ads  Ad Id  Images Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/public/fast-crawl":{"post":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Public Fast Crawl Website","description":"Public fast-crawl endpoint for pre-registration use.\n\nThis endpoint allows fast-crawling a website BEFORE the user has registered,\nenabling the frontend to start crawling as soon as the user enters their\nwebsite URL (at signup step 5) rather than waiting until after registration.\n\n**Authentication**: Requires X-Public-Token header (not user JWT).\n\nThe results (S3 URLs for logo and screenshots) are returned directly.\nThe frontend should cache these and pass them to the profile creation\nflow after user registration.\n\nRequest body:\n- website_url: URL of the website to crawl\n\nResponse:\n- website_id: Saphire website ID (for reference)\n- logo_url: S3 URL of the primary logo (if found)\n- screenshot_urls: List of S3 URLs for homepage screenshots\n- logos_found: Number of logos extracted\n- screenshots_captured: Number of screenshots taken\n- elapsed_seconds: Time taken\n- message: Status message","operationId":"public_fast_crawl_website_api_v1_ad_campaigns_public_fast_crawl_post","parameters":[{"name":"X-Public-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Public-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FastCrawlRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FastCrawlResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/public/empty-website":{"post":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Public Create Empty Website","description":"Create an empty website for lite users during signup.\n\n**Authentication**: Requires X-Public-Token header (not user JWT).\n\nCreates a placeholder website in Saphire. Idempotent - safe to retry.","operationId":"public_create_empty_website_api_v1_ad_campaigns_public_empty_website_post","parameters":[{"name":"X-Public-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Public-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyWebsiteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/lite/create-empty-website":{"post":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Create Lite Empty Website","description":"Create an empty website for authenticated lite users.\nAlso creates a CompanyProfile with BRAND_ASSETS_VERIFIED status.\n\n**Authentication**: Requires user JWT (not public token).\n\nCreates a website in Saphire AND a SaphireWebsite record in the database.\nAlso creates a CompanyProfile to allow ad generation flow to work.\nIdempotent - returns existing website if one exists for this user.","operationId":"create_lite_empty_website_api_v1_ad_campaigns_lite_create_empty_website_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiteEmptyWebsiteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmptyWebsiteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/public/anonymous-generate":{"post":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Public Anonymous Generate","description":"Start full anonymous ad generation pipeline (text + images).\n\nCreates an anonymous user, sets up Saphire (fast-crawl or empty website),\nuploads reference/product images, and runs the complete ad generation pipeline.\n\n**Authentication**: Requires X-Public-Token header (not user JWT).\n**Rate limit**: 1 request per IP per 24 hours.\n\nIf `website` is provided, fast-crawl is used for brand assets.\nIf no `website`, then `company_short_description` and `product_images` are required.","operationId":"public_anonymous_generate_api_v1_ad_campaigns_public_anonymous_generate_post","parameters":[{"name":"X-Public-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Public-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousPipelineStartRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousPipelineStartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/public/rate-limit-status":{"get":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Public Anonymous Rate Limit Status","description":"Check whether the caller's IP is currently rate-limited for anonymous ad generation.\n\n**Authentication**: Requires X-Public-Token header (not user JWT).\n\nReturns:\n    - `is_limited`: whether the IP has already used its daily generation\n    - `remaining`: number of generations left (0 or 1)\n    - `retry_after_seconds`: seconds until the limit resets (null if not limited)","operationId":"public_anonymous_rate_limit_status_api_v1_ad_campaigns_public_rate_limit_status_get","parameters":[{"name":"X-Public-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Public-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-campaigns/public/anonymous-generate/{job_id}":{"get":{"tags":["ad-campaigns","ad-campaigns"],"summary":"Public Anonymous Generate Status","description":"Check status of anonymous ad generation pipeline.\n\n**Authentication**: Requires X-Public-Token header (not user JWT).\n\nReturns the current status. When `ad_campaign_created`, includes full profile data\nwith campaigns, ads, and image URLs.","operationId":"public_anonymous_generate_status_api_v1_ad_campaigns_public_anonymous_generate__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"X-Public-Token","in":"header","required":false,"schema":{"type":"string","title":"X-Public-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousPipelineStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-images/download-access":{"post":{"tags":["ad-images","Ad Images"],"summary":"Authorize Download Access","description":"Authorize an original image download for the authenticated user.\n\nSubscribed or AppSumo users have unlimited downloads.\nUnsubscribed users are also unlimited unless LIMIT_UNSUBSCRIBED_DOWNLOADS is\nenabled, in which case they consume from a configurable free-download allowance.","operationId":"authorize_download_access_api_v1_ad_images_download_access_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DownloadAccessRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DownloadAccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-images/ads/batch":{"get":{"tags":["ad-images","Ad Images"],"summary":"List Ad Images Batch","description":"List images for multiple ads in a single request.\n\nThis batch endpoint eliminates N+1 queries when displaying images\nfor multiple ads. Returns images for all requested ads that the\nuser has permission to access.\n\n**Query Parameters:**\n- `ids`: Comma-separated ad IDs (e.g., \"1038,1039,1040,1041,1042\")\n\n**Response:**\n- `ads`: Map of ad_id to images list (same format as single ad endpoint)\n- `total_ads`: Number of ads successfully returned\n- `requested_ids`: Original IDs that were requested\n- `missing_ids`: IDs not found or user lacks permission","operationId":"list_ad_images_batch_api_v1_ad_images_ads_batch_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ids","in":"query","required":true,"schema":{"type":"string","description":"Comma-separated list of ad IDs","title":"Ids"},"description":"Comma-separated list of ad IDs"},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdImagesBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-images/ad/{ad_id}":{"get":{"tags":["ad-images","Ad Images"],"summary":"List Ad Images","description":"List all images for an ad.\n\nReturns all AdImage records for the specified ad, including the primary image.\nThe primary image is always the square (1:1) image.","operationId":"list_ad_images_api_v1_ad_images_ad__ad_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ad_id","in":"path","required":true,"schema":{"type":"integer","title":"Ad Id"}},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdImagesListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-images/resize-primary":{"post":{"tags":["ad-images","Ad Images"],"summary":"Resize Primary Image","description":"Resize the primary ad image to a different aspect ratio.\n\nUses Saphire's edit flow to regenerate the image in the target aspect ratio\nwhile preserving visual content. Creates a new AdImage record linked to the\nsame ad.\n\n**Constraints:**\n- Source image must be the primary (square) image\n- Target aspect ratio must be portrait or landscape\n- Target aspect ratio cannot already exist for this ad\n\n**Request:**\n- `ad_image_id`: Source image to resize (must be square/primary)\n- `target_aspect_ratio`: Target aspect ratio (portrait or landscape)\n\n**Returns:**\n- Source and resized image details\n\n**Credits:** Consumes 1 credit per resize operation.","operationId":"resize_primary_image_api_v1_ad_images_resize_primary_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResizeImageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResizeImageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-images/resize-by-url":{"post":{"tags":["ad-images","Ad Images"],"summary":"Resize Image By Url","description":"Resize an image by URL (no AdImage record required).\n\nUses Gemini AI to regenerate the image at the target aspect ratio.\nUseful for images from chat/marketing agent that don't have ad records.\n\n**Credits:** Consumes 1 credit per resize operation.","operationId":"resize_image_by_url_api_v1_ad_images_resize_by_url_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResizeByUrlRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResizeByUrlResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-images/enhance-for-print":{"post":{"tags":["ad-images","Ad Images"],"summary":"Enhance Image For Print","description":"Enhance ad image for A3/A4 print with Gemini AI.\n\nUses Google Gemini's image generation to enhance the image quality to 4K\nresolution and add appropriate margins/spacing for the target print format.\nThe enhanced image is optimized for high-quality printing.\n\n**Print Formats:**\n- `a3_portrait`: A3 size in portrait orientation (297x420mm, 2:3 ratio)\n- `a3_landscape`: A3 size in landscape orientation (420x297mm, 3:2 ratio)\n- `a4_portrait`: A4 size in portrait orientation (210x297mm, 2:3 ratio)\n- `a4_landscape`: A4 size in landscape orientation (297x210mm, 3:2 ratio)\n\n**Output Formats:**\n- `jpeg`: High-quality JPEG (default, best for print)\n- `png`: Lossless PNG\n- `pdf`: PDF document ready for printing\n\n**Request:**\n- `ad_image_id`: Source image ID to enhance (use this OR image_url)\n- `image_url`: Direct URL of the image to enhance (use this OR ad_image_id)\n- `print_format`: Target print format\n- `output_format`: Output file format (default: jpeg)\n\n**Returns:**\n- Source image details (if ad_image_id provided)\n- Enhanced image URL ready for download\n- Print metadata\n\n**Credits:** Consumes 2 credits per print enhancement operation.","operationId":"enhance_image_for_print_api_v1_ad_images_enhance_for_print_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhanceForPrintRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhanceForPrintResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stripe/webhook":{"post":{"tags":["stripe"],"summary":"Stripe Webhook","description":"Handle Stripe webhook events.cp[]\n\nThis endpoint receives events from Stripe about payment changes.\nIt must be configured in the Stripe Dashboard to receive:\n- checkout.session.completed (for credit purchases)","operationId":"stripe_webhook_api_v1_stripe_webhook_post","parameters":[{"name":"Stripe-Signature","in":"header","required":false,"schema":{"type":"string","title":"Stripe-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stripe/config":{"get":{"tags":["stripe"],"summary":"Get Stripe Config","description":"Get public Stripe configuration.\n\nReturns whether Stripe is configured and available credit packages.\nAccepts an optional country code to return region-appropriate pricing.\nDoes NOT expose secret keys.","operationId":"get_stripe_config_api_v1_stripe_config_get","parameters":[{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stripe/discount":{"get":{"tags":["stripe"],"summary":"Get User Discount","description":"Return the current user's AppSumo discount info.\n\nReturns {has_discount, tier, discount_percent} so the frontend\ncan show discounted prices on the pricing cards.","operationId":"get_user_discount_api_v1_stripe_discount_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/stripe/subscription-status":{"get":{"tags":["stripe"],"summary":"Get Subscription Status","description":"Return the authenticated user's current subscription status.\n\nActive subscriptions prefer live Stripe period data so the frontend can\nshow the next renewal date. Users without a paid subscription return a\nnormalized \"free\" status.","operationId":"get_subscription_status_api_v1_stripe_subscription_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionStatusResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/stripe/invoices":{"get":{"tags":["stripe"],"summary":"Get Invoices","description":"Return recent Stripe invoices for the authenticated paid Stripe user.\n\nFree, cancelled, and AppSumo-only users do not receive invoice data.","operationId":"get_invoices_api_v1_stripe_invoices_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":12,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StripeInvoiceResponse"},"title":"Response Get Invoices Api V1 Stripe Invoices Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stripe/billing-portal-session":{"post":{"tags":["stripe"],"summary":"Create Billing Portal Session","description":"Create a Stripe-hosted billing portal session for a paid Stripe user.","operationId":"create_billing_portal_session_api_v1_stripe_billing_portal_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingPortalSessionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingPortalSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/stripe/create-credits-checkout-session":{"post":{"tags":["stripe"],"summary":"Create Credits Checkout Session","description":"Create a Stripe Checkout Session for purchasing credits.\n\nThis is a one-time payment (not subscription).\nRequires a package_id (credits_10, credits_50, credits_100).\nAppSumo users automatically receive their tier discount.","operationId":"create_credits_checkout_session_api_v1_stripe_create_credits_checkout_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutSessionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/stripe/create-checkout-session":{"post":{"tags":["stripe"],"summary":"Create Checkout Session","description":"Create a Stripe Checkout Session for a regular Basic subscription (no discount).","operationId":"create_checkout_session_api_v1_stripe_create_checkout_session_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutSessionResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/stripe/create-promo-checkout-session":{"post":{"tags":["stripe"],"summary":"Create Promo Checkout Session","description":"Create a Stripe Checkout Session for a promotional subscription.\n\nThis creates a subscription checkout with a deep discount coupon applied.\nOn successful payment, the webhook grants credits to the user.","operationId":"create_promo_checkout_session_api_v1_stripe_create_promo_checkout_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoCheckoutSessionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/credits/balance":{"get":{"tags":["credits"],"summary":"Get Credit Balance","description":"Get current user's credit balance.\n\nReturns the current balance along with lifetime totals for\nearned and spent credits, plus the next renewal date and monthly\ncredit amount (computed from subscription anchor dates).\n\nUses a single query to resolve team ownership and fetch credits +\nsubscription info.","operationId":"get_credit_balance_api_v1_credits_balance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditBalanceResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/credits/transactions":{"get":{"tags":["credits"],"summary":"Get Transaction History","description":"Get credit transaction history for current user.\n\nSupports pagination with limit/offset and optional filtering by transaction type.\nTransactions are returned in reverse chronological order (newest first).","operationId":"get_transaction_history_api_v1_credits_transactions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Number of transactions to return","default":50,"title":"Limit"},"description":"Number of transactions to return"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Offset for pagination","default":0,"title":"Offset"},"description":"Offset for pagination"},{"name":"transaction_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by transaction type (registration_bonus, purchase, usage, refund)","title":"Transaction Type"},"description":"Filter by transaction type (registration_bonus, purchase, usage, refund)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditTransactionHistoryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/credits/claims":{"get":{"tags":["credits"],"summary":"Get Claimed Rewards","description":"Get list of reward types already claimed by the user.\n\nReturns which rewards the user has already claimed and which are still available.","operationId":"get_claimed_rewards_api_v1_credits_claims_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimedRewardsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/credits/claim":{"post":{"tags":["credits"],"summary":"Claim Credit Reward","description":"Claim a one-time credit reward.\n\nEach reward type can only be claimed once per user.\nValid claim types: linkedin_follow, twitter_follow, referral, feedback","operationId":"claim_credit_reward_api_v1_credits_claim_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/credits/submit-pending-claim":{"post":{"tags":["credits"],"summary":"Submit Pending Claim","description":"Submit a pending claim that requires manual verification.\n\nRecords the claim attempt but does NOT award credits immediately.\n- instagram_follow: Credits granted automatically after 5-minute delay\n- twitter_follow, referral: Credits awarded manually after verification","operationId":"submit_pending_claim_api_v1_credits_submit_pending_claim_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PendingClaimResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/credits/rewards":{"get":{"tags":["credits"],"summary":"Get Reward Amounts","description":"Get all credit reward amounts.\n\nReturns the credit amounts for all reward types.\nThis endpoint is public (no auth required) so the frontend\ncan display reward values before user interaction.","operationId":"get_reward_amounts_api_v1_credits_rewards_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RewardAmountsResponse"}}}}}}},"/api/v1/credits/generate-tweet":{"get":{"tags":["credits"],"summary":"Generate Tweet","description":"Generate a personalized tweet about how great the ads Lapis created are.\n\nUses the user's company profile context (company name, industry, what they do)\nto generate a tweet that feels authentic and specific to the user rather than generic.\n\nReturns a creative tweet (<240 chars) that tags @trylapis.","operationId":"generate_tweet_api_v1_credits_generate_tweet_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateTweetResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/feedback/validate":{"post":{"tags":["feedback"],"summary":"Validate Feedback","description":"Validate that feedback is meaningful and not gibberish.\n\nUses GPT-4o-mini to check if the feedback contains coherent,\nmeaningful content rather than random strings or nonsense.","operationId":"validate_feedback_api_v1_feedback_validate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackValidateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackValidateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/feedback":{"post":{"tags":["feedback"],"summary":"Submit Feedback","description":"Submit user feedback.\n\nStores the feedback in the database and sends a Slack notification.\nAt least one of use_case_response or feature_request must be provided.","operationId":"submit_feedback_api_v1_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/feedback/download-usage/submitted":{"get":{"tags":["feedback"],"summary":"Get Submitted Download Feedback","description":"Get list of page sources where user has already submitted download usage feedback.\n\nUsed by frontend to determine if feedback modal should be shown.","operationId":"get_submitted_download_feedback_api_v1_feedback_download_usage_submitted_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmittedSourcesResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/feedback/download-usage":{"post":{"tags":["feedback"],"summary":"Submit Download Usage Feedback","description":"Submit download usage feedback.\n\nRecords how user plans to use downloaded images (ads vs other).\nAwards +1 credit for providing feedback.\nSends Slack notification.","operationId":"submit_download_usage_feedback_api_v1_feedback_download_usage_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DownloadUsageFeedbackCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DownloadUsageFeedbackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/reference-ad-images/unrated":{"get":{"tags":["reference-ad-images","reference-ad-images"],"summary":"Get Unrated Images","description":"Get random reference ad images that the user has not yet rated.\n\nReturns 5 human_only images and 5 illustration_only images (10 total),\nalong with the total count of unrated images remaining.","operationId":"get_unrated_images_api_v1_reference_ad_images_unrated_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnratedImagesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/reference-ad-images/{image_id}/judge":{"post":{"tags":["reference-ad-images","reference-ad-images"],"summary":"Judge Image","description":"Submit a like or dislike judgement for a reference ad image.\n\n- **image_id**: The ID of the reference ad image to judge\n- **is_liked**: True for like, False for dislike\n\nReturns 409 Conflict if user has already judged this image.","operationId":"judge_image_api_v1_reference_ad_images__image_id__judge_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"integer","title":"Image Id"}},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserReferenceJudgementCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserReferenceJudgementRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["reference-ad-images","reference-ad-images"],"summary":"Remove Judgement","description":"Remove a judgement for a reference ad image.\n\n- **image_id**: The ID of the reference ad image to remove judgement for\n\nReturns 404 if no judgement exists for this image.","operationId":"remove_judgement_api_v1_reference_ad_images__image_id__judge_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"integer","title":"Image Id"}},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/image-agent/chat":{"post":{"tags":["image-agent","Image Agent"],"summary":"Chat","description":"Send a message to the image agent.","operationId":"chat_api_v1_image_agent_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/image-agent/sessions":{"post":{"tags":["image-agent","Image Agent"],"summary":"Create Session","description":"Create a new image agent session.\n\nCreates a new session without sending a chat message. If an ad_id is provided,\ncontext is automatically loaded from the database and the ad's existing creative\nimage (if any) is added to the workspace with an initial assistant message.\n\n**Request:**\n- `ad_id` (optional): AdCampaignAd ID - automatically loads target_audience, product_info,\n  brand_guidelines, intro_text, reference_images, and saphire_website_id from database\n- `context` (optional): Manual context override (only used if ad_id not provided)\n- `saphire_website_id` (optional): Saphire website ID (only used if ad_id not provided)\n\n**Response:**\n- Complete session detail including workspace state and initial messages","operationId":"create_session_api_v1_image_agent_sessions_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSessionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["image-agent","Image Agent"],"summary":"List Sessions","description":"List user's image agent sessions.\n\nReturns a summary of each session including status, image count,\nand preview text.\n\nOptionally filter by ad_id to get all sessions for a specific ad.","operationId":"list_sessions_api_v1_image_agent_sessions_get","security":[{"HTTPBearer":[]}],"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"}},{"name":"ad_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ad Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SessionSummary"},"title":"Response List Sessions Api V1 Image Agent Sessions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/image-agent/sessions/latest":{"get":{"tags":["image-agent","Image Agent"],"summary":"Get Latest Session","description":"Get the most recent session for the current user.\n\nReturns the complete session including all messages, images,\nand workspace state. Useful for resuming the last conversation.","operationId":"get_latest_session_api_v1_image_agent_sessions_latest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionDetail"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/image-agent/sessions/{session_id}":{"get":{"tags":["image-agent","Image Agent"],"summary":"Get Session","description":"Get a session with full conversation history.\n\nReturns the complete session including all messages, images,\nand workspace state.","operationId":"get_session_api_v1_image_agent_sessions__session_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["image-agent","Image Agent"],"summary":"Delete Session","description":"Delete a session and all its messages.","operationId":"delete_session_api_v1_image_agent_sessions__session_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","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/image-agent/sessions/{session_id}/primary-image":{"put":{"tags":["image-agent","Image Agent"],"summary":"Set Session Primary Image","description":"Set the primary image for a session.\n\nThe primary image is the \"active\" image that will be used as the default\ntarget for edit operations. Also adds chat history entries.","operationId":"set_session_primary_image_api_v1_image_agent_sessions__session_id__primary_image_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetPrimaryImageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceOutput"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/image-agent/sessions/{session_id}/save-to-ad":{"post":{"tags":["image-agent","Image Agent"],"summary":"Save Workspace Image To Ad","description":"Save a workspace image as the primary image for the ad.\n\nSets the selected workspace image as the ad's primary image and optionally\nupdates headline/subtext from the image metadata.\n\n**Requirements:**\n- Session must have an associated ad_id\n- Image must exist in the session's workspace\n- User must own the ad","operationId":"save_workspace_image_to_ad_api_v1_image_agent_sessions__session_id__save_to_ad_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveImageToAdRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveImageToAdResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/image-agent/session-references":{"post":{"tags":["image-agent","Image Agent"],"summary":"Upload Session References","description":"Upload reference images for session-based image generation.\n\nImages are uploaded to S3 and tracked in the database linked to a session.\nWhen the session is deleted, the reference records are automatically deleted\n(CASCADE), enabling future S3 cleanup.\n\n**Usage Flow:**\n1. Upload images via this endpoint (optionally with existing session_id)\n2. Use the returned `session_id` and `reference_image_urls` in the chat request\n3. Images persist as long as the session exists\n\n**Request:**\n- `session_id`: Optional existing session ID (creates new session if not provided)\n- `images`: List of base64-encoded images (first is logo, rest are style refs)\n- `formats`: Optional list of formats (png, jpg, etc.)\n\n**Response:**\n- `session_id`: The session ID (new or existing)\n- `reference_image_urls`: List of S3 URLs to pass as `context.reference_images`\n- `images_uploaded`: Count of successfully uploaded images","operationId":"upload_session_references_api_v1_image_agent_session_references_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionReferenceUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionReferenceUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/image-agent/sessions/{session_id}/references":{"get":{"tags":["image-agent","Image Agent"],"summary":"Get Session References","description":"Get all reference images for a session.\n\nUse this to restore reference images when continuing an existing session.","operationId":"get_session_references_api_v1_image_agent_sessions__session_id__references_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SessionReferenceImageOutput"},"title":"Response Get Session References Api V1 Image Agent Sessions  Session Id  References Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/image-agent/generate-template-prompt":{"post":{"tags":["image-agent","Image Agent"],"summary":"Generate Template Prompt","description":"Generate a personalized prompt for a specific template type.\n\nUses product understanding if available, otherwise company_short_desc.\nFalls back to generic template if no context exists.","operationId":"generate_template_prompt_api_v1_image_agent_generate_template_prompt_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_GenerateTemplatePromptRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/_GenerateTemplatePromptResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/image-agent/extract-product-url":{"post":{"tags":["image-agent","Image Agent"],"summary":"Extract Product From Url","description":"Extract product data (name, price, images, description) from a URL.\n\nUses Firecrawl to scrape the page HTML, then runs HybridProductExtractor\n(rule-based Shopify/JSON-LD/OG parsing with Gemini LLM fallback) to pull\nstructured product information.\n\nIntended for the ads-studio \"paste a link\" flow — the frontend calls this\nwhen a user pastes a product URL, then creates a url_product chip with\nthe returned data.","operationId":"extract_product_from_url_api_v1_image_agent_extract_product_url_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractProductUrlRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractProductUrlResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/image-judge/evaluate":{"post":{"tags":["image-judge","Image Judge"],"summary":"Evaluate Image","description":"Evaluate an ad image against the creative quality rubric.\n\nAccepts an image via URL or base64 and returns a structured quality evaluation\nwith 20 scored criteria (1-5 Likert scale) and an average score.\n\nOptionally accepts a creative brief and brand context for more accurate evaluation.","operationId":"evaluate_image_api_v1_image_judge_evaluate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageJudgeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageJudgeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/image-judge/public/rate-limit-status":{"get":{"tags":["image-judge","Image Judge"],"summary":"Public Image Judge Rate Limit Status","description":"Check whether the caller's IP is currently rate-limited for public image evaluation.\n\n**Authentication**: Requires X-Public-Token header (not user JWT).\n\nReturns:\n    - `is_limited`: whether the IP has hit the hourly limit\n    - `remaining`: evaluations left this hour\n    - `retry_after_seconds`: seconds until the limit resets (null if not limited)","operationId":"public_image_judge_rate_limit_status_api_v1_image_judge_public_rate_limit_status_get","parameters":[{"name":"X-Public-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Public-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/image-judge/public/evaluate":{"post":{"tags":["image-judge","Image Judge"],"summary":"Public Evaluate Image","description":"Public image quality evaluation with token auth and basic abuse protections.\n\nRequires X-Public-Token header.","operationId":"public_evaluate_image_api_v1_image_judge_public_evaluate_post","parameters":[{"name":"X-Public-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Public-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageJudgeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageJudgeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/image-judge/public/scores/batch":{"post":{"tags":["image-judge","Image Judge"],"summary":"Batch Get Scores","description":"Look up cached quality scores for a batch of image URLs.\n\nReturns only pre-cached scores (does NOT trigger evaluation for missing ones).\nSingle DB query, no AI calls — designed for fast page loads.\nRequires X-Public-Token header.","operationId":"batch_get_scores_api_v1_image_judge_public_scores_batch_post","parameters":[{"name":"X-Public-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Public-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchScoresRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchScoresResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/image-judge/public/scores/batch-evaluate":{"post":{"tags":["image-judge","Image Judge"],"summary":"Batch Evaluate Scores","description":"Dispatch batch image evaluation via Celery workers.\n\n1. Returns any already-cached scores immediately.\n2. Dispatches one Celery task per uncached URL.\n3. Returns a batch_id for polling via batch-status endpoint.\n\nRequires X-Public-Token header.","operationId":"batch_evaluate_scores_api_v1_image_judge_public_scores_batch_evaluate_post","parameters":[{"name":"X-Public-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Public-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchEvaluateRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchEvaluateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/image-judge/public/scores/batch-status":{"get":{"tags":["image-judge","Image Judge"],"summary":"Batch Status","description":"Poll for batch evaluation status.\n\nEvery poll recomputes, over the batch's full original URL list, the scores\navailable so far, the URLs whose evaluation failed for good (``failed_urls``,\nfrom this batch's worker-written markers) and the URLs still pending, and\nreturns all three. Nothing is mutated on poll, so responses are idempotent:\na lost or overlapping poll cannot make a URL disappear from later responses,\nand the completion response partitions every original URL across the three\nsets. The batch simply expires ``BATCH_PENDING_TTL`` after creation.\nRequires X-Public-Token header.","operationId":"batch_status_api_v1_image_judge_public_scores_batch_status_get","parameters":[{"name":"batch_id","in":"query","required":true,"schema":{"type":"string","description":"Batch ID from batch-evaluate response","title":"Batch Id"},"description":"Batch ID from batch-evaluate response"},{"name":"X-Public-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Public-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feature-flags/{key}":{"get":{"tags":["feature-flags","feature-flags"],"summary":"Get Feature Flag","description":"Get a feature flag by key.\n\nReturns the feature flag's enabled status.\nIf the flag doesn't exist, returns enabled=False.","operationId":"get_feature_flag_api_v1_feature_flags__key__get","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureFlagResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/waitlist":{"post":{"tags":["waitlist","waitlist"],"summary":"Add To Waitlist","description":"Add a user to the waitlist.\n\nCollects email and optional website for early access signups.\nReturns 409 if email already exists.","operationId":"add_to_waitlist_api_v1_waitlist_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaitlistRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaitlistResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gallery/public/feed":{"get":{"tags":["gallery","Gallery"],"summary":"Public Gallery Feed","description":"Return recently generated images.\n\nReads from a Redis list for speed. Falls back to Postgres if Redis is empty.","operationId":"public_gallery_feed_api_v1_gallery_public_feed_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by language (e.g. Hindi, Tamil, Telugu)","title":"Language"},"description":"Filter by language (e.g. Hindi, Tamil, Telugu)"},{"name":"X-Public-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Public-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GalleryFeedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/gallery/feed":{"get":{"tags":["gallery","Gallery"],"summary":"Authenticated Gallery Feed","description":"Return a paginated community feed based on the user's ad language.\n\nAutomatically reads the user's ``ad_primary_language``.  If the language\nis not one of the supported community languages, returns an empty feed.","operationId":"authenticated_gallery_feed_api_v1_gallery_feed_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GalleryPaginatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dau-tracking/report":{"post":{"tags":["dau-tracking"],"summary":"Send Daily Digest","description":"Return daily digest metrics.\n\nThis endpoint is intended to be called by an external cron job (once daily).\nIt queries key metrics directly from the database and returns them.\n\nReturns:\n    dict with metrics","operationId":"send_daily_digest_api_v1_dau_tracking_report_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/collections/my-collections":{"get":{"tags":["collections","Collections"],"summary":"Get My Collections","description":"Get all collections for the current user's saphire website.\n\nThis is a convenience endpoint that:\n1. Looks up the user's saphire_website_id\n2. Gets all collection groups for that website\n3. Returns all collections across all groups (with images)\n\nReturns collections with their slugs (for @mention usage).","operationId":"get_my_collections_api_v1_collections_my_collections_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CollectionSchema"},"type":"array","title":"Response Get My Collections Api V1 Collections My Collections Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/collections/my-collections/status":{"get":{"tags":["collections","Collections"],"summary":"Get My Collections Status","description":"Get collection crawl status for the current user.\n\nUses the primary (writable) session because the timeout-transition branch\nbelow flips a running crawl marker to failed and commits. A read-replica\nsession would 500 that branch on the read-only connection.\n\nReturns:\n- is_crawling: True if collections are still being crawled\n- done_count: Number of collections that are ready\n- pending_count: Number of collections still being scraped\n- total_count: Total collections","operationId":"get_my_collections_status_api_v1_collections_my_collections_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionsStatusResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/collections/my-collections/generate":{"post":{"tags":["collections","Collections"],"summary":"Generate My Collections","description":"Trigger collections crawl for the current user's website.\n\nAccepts an optional website_url to crawl a specific URL instead of\nthe user's primary website.  Lite users (placeholder website) can\nprovide a URL here to import products without upgrading.","operationId":"generate_my_collections_api_v1_collections_my_collections_generate_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/GenerateCollectionsRequest"},{"type":"null"}],"title":"Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/collections/upload-product-images":{"post":{"tags":["collections","Collections"],"summary":"Upload Product Images","description":"Upload product images to create a new collection.\n\nThis endpoint allows users to upload up to 10 product images, which will:\n1. Upload each image to S3\n2. Create a new collection in Saphire with the \"Uploaded Products\" group\n3. Return the collection details\n\n**Request Body:**\n- `collection_name`: Name for the new collection (required)\n- `images`: List of base64-encoded images (1-10 images, required)\n- `formats`: Optional list of image formats (png, jpg, etc.)\n- `description`: Optional description for the collection\n\n**Returns:**\n- Collection details including collection_id, group_id, and uploaded image URLs","operationId":"upload_product_images_api_v1_collections_upload_product_images_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductImageUploadRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductImageUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/collections/upload-product-images/batch":{"post":{"tags":["collections","Collections"],"summary":"Upload Product Images Batch","description":"Upload product images to create separate collections (one per product).\n\nSupports partial success — some products may fail while others succeed.\nEach result includes the original `index` for correlation with the request.","operationId":"upload_product_images_batch_api_v1_collections_upload_product_images_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchProductImageUploadRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchProductImageUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/collections/presigned-upload":{"post":{"tags":["collections","Collections"],"summary":"Get Presigned Upload Urls","description":"Generate presigned S3 PUT URLs for direct browser-to-S3 uploads.","operationId":"get_presigned_upload_urls_api_v1_collections_presigned_upload_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresignedUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresignedUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/collections/finalize-upload":{"post":{"tags":["collections","Collections"],"summary":"Finalize Presigned Upload","description":"Create DB records after files have been uploaded directly to S3.","operationId":"finalize_presigned_upload_api_v1_collections_finalize_upload_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FinalizeUploadRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchProductImageUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/collections/groups/{group_id}":{"get":{"tags":["collections","Collections"],"summary":"Get Collection Group","description":"Get a collection group with all its collections.","operationId":"get_collection_group_api_v1_collections_groups__group_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionGroupDetailSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/collections/groups/{group_id}/crawl":{"post":{"tags":["collections","Collections"],"summary":"Crawl Collection Group","description":"Crawl and populate a collection group using Firecrawl.\n\nTriggers the local crawl pipeline in background via Celery.","operationId":"crawl_collection_group_api_v1_collections_groups__group_id__crawl_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}},{"name":"base_url","in":"query","required":true,"schema":{"type":"string","title":"Base Url"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":100,"title":"Limit"}},{"name":"max_concurrency","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":10,"title":"Max Concurrency"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_crawl_collection_group_api_v1_collections_groups__group_id__crawl_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrawlCollectionGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/collections/groups/{group_id}/weekly-update":{"post":{"tags":["collections","Collections"],"summary":"Weekly Update","description":"Generate a weekly update report with categorized changes and AI-suggested ads.\n\nOptionally triggers a spider refresh first (if `run_crawl=True`).\nQueries ProductChange/B2BChange for the last N hours and categorizes them.\nUses Gemini to generate ad suggestions based on detected changes.","operationId":"weekly_update_api_v1_collections_groups__group_id__weekly_update_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"integer","title":"Group Id"}},{"name":"run_crawl","in":"query","required":false,"schema":{"type":"boolean","description":"Trigger spider refresh before generating report","default":false,"title":"Run Crawl"},"description":"Trigger spider refresh before generating report"},{"name":"hours","in":"query","required":false,"schema":{"type":"integer","maximum":720,"minimum":1,"description":"Look back window in hours","default":168,"title":"Hours"},"description":"Look back window in hours"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/collections/{collection_id}":{"get":{"tags":["collections","Collections"],"summary":"Get Collection","description":"Get a collection with all its images.","operationId":"get_collection_api_v1_collections__collection_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"collection_id","in":"path","required":true,"schema":{"type":"integer","title":"Collection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionDetailSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["collections","Collections"],"summary":"Update Collection","description":"Rename or update a collection owned by the current brand.","operationId":"update_collection_api_v1_collections__collection_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"collection_id","in":"path","required":true,"schema":{"type":"integer","title":"Collection Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCollectionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionDetailSchema"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["collections","Collections"],"summary":"Delete Collection","description":"Delete a collection owned by the current brand.","operationId":"delete_collection_api_v1_collections__collection_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"collection_id","in":"path","required":true,"schema":{"type":"integer","title":"Collection Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/collections/generate-product-prompt":{"post":{"tags":["collections","Collections"],"summary":"Generate Product Prompt","description":"Generate ad prompt from product images and template using GPT-5.1 vision.\n\nThis endpoint:\n1. Fetches product images from the specified collections\n2. Sends them to GPT-5.1 vision along with the template info\n3. Uses product understanding from CompanyProfile or company description from User\n4. Returns a customized prompt featuring the user's actual products","operationId":"generate_product_prompt_api_v1_collections_generate_product_prompt_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateProductPromptRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateProductPromptResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/character-style/characters":{"get":{"tags":["character-style","Character & Style Personalization"],"summary":"Get Characters","description":"Get personalized characters for the current user.\n\nReturns characters with promptAdditions personalized for the user's brand.\nIf no company context is available, returns generic base characters.\n\nCharacters are generated once and cached. Subsequent calls return cached data.\n\n**Response:**\n- `characters`: List of character personas\n- `source`: Where the context came from\n- `memory`: Context data used for personalization","operationId":"get_characters_api_v1_character_style_characters_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CharactersResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/character-style/styles":{"get":{"tags":["character-style","Character & Style Personalization"],"summary":"Get Styles","description":"Get personalized styles for the current user.\n\nReturns styles with promptAdditions personalized for the user's brand.\nIf no company context is available, returns generic base styles.\n\nStyles are generated once and cached. Subsequent calls return cached data.\n\n**Response:**\n- `styles`: List of visual styles\n- `source`: Where the context came from\n- `memory`: Context data used for personalization","operationId":"get_styles_api_v1_character_style_styles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StylesResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/character-style/all":{"get":{"tags":["character-style","Character & Style Personalization"],"summary":"Get All Personalized","description":"Get both personalized characters and styles for the current user.\n\nReturns both characters and styles with promptAdditions personalized for the user's brand.\nMore efficient than calling /characters and /styles separately.\n\n**Response:**\n- `characters`: List of character personas\n- `characters_source`: Source of character personalization\n- `styles`: List of visual styles\n- `styles_source`: Source of style personalization\n- `memory`: Context data used for personalization (shared for both)","operationId":"get_all_personalized_api_v1_character_style_all_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllPersonalizedResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/character-style/regenerate":{"post":{"tags":["character-style","Character & Style Personalization"],"summary":"Regenerate Personalization","description":"Force regenerate personalized characters and styles.\n\nUseful when the user's company context has changed significantly\n(e.g., updated company description, new product offerings).\n\nThis will discard any existing personalization and generate fresh data.\n\n**Response:**\n- `success`: Whether regeneration was successful\n- `message`: Status message\n- `characters`: Newly generated character personas\n- `styles`: Newly generated visual styles\n- `memory`: Context data used for personalization","operationId":"regenerate_personalization_api_v1_character_style_regenerate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegenerateResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/character-style/trigger-personalization":{"post":{"tags":["character-style","Character & Style Personalization"],"summary":"Trigger Personalization Background","description":"Trigger personalization in the background.\n\nReturns immediately and processes personalization asynchronously.\nUseful for calling after signup without blocking the user flow.","operationId":"trigger_personalization_background_api_v1_character_style_trigger_personalization_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/character-style/generate-portraits":{"post":{"tags":["character-style","Character & Style Personalization"],"summary":"Generate Portraits Background","description":"Trigger portrait image generation for existing personalized characters.\n\nReturns immediately and processes portrait generation asynchronously.\nUseful for regenerating portraits without re-personalizing characters.\nCharacters that already have an image_url are skipped.","operationId":"generate_portraits_background_api_v1_character_style_generate_portraits_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/events":{"post":{"tags":["events"],"summary":"Record Event","description":"Record a user event.\n\nThis endpoint is used to track user actions for analytics purposes.\nEvents are stored with the user's ID and can include arbitrary metadata.\n\nCommon event types:\n- ad_shared: User shared an ad to a platform\n- ad_downloaded: User downloaded an ad image\n- ad_edited: User opened the ad editor\n\nArgs:\n    event: Event data including type, source, and metadata\n\nReturns:\n    Created event record","operationId":"record_event_api_v1_events_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserEventCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserEventResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/appsumo/webhook":{"post":{"tags":["appsumo"],"summary":"Appsumo Webhook","description":"Receive and handle AppSumo webhook events (purchase, activate, upgrade, downgrade, deactivate).","operationId":"appsumo_webhook_api_v1_appsumo_webhook_post","parameters":[{"name":"X-Appsumo-Signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Appsumo-Signature"}},{"name":"X-Appsumo-Timestamp","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Appsumo-Timestamp"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppSumoWebhookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/appsumo/oauth/callback":{"get":{"tags":["appsumo"],"summary":"Appsumo Oauth Callback","description":"OAuth callback from AppSumo activation flow.\n\n- No ``code`` param → return 200 (AppSumo URL validation probe).\n- With ``code`` → exchange for token, fetch license key, redirect to frontend signup.","operationId":"appsumo_oauth_callback_api_v1_appsumo_oauth_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/appsumo/validate/{license_key}":{"get":{"tags":["appsumo"],"summary":"Validate License","description":"Validate a license key and return its details. Called by the frontend during signup.","operationId":"validate_license_api_v1_appsumo_validate__license_key__get","parameters":[{"name":"license_key","in":"path","required":true,"schema":{"type":"string","title":"License Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppSumoLicenseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team":{"get":{"tags":["team"],"summary":"Get Team","description":"Get the current user's team (as owner or member). Returns null if not on a team.","operationId":"get_team_api_v1_team_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TeamResponse"},{"type":"null"}],"title":"Response Get Team Api V1 Team Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["team"],"summary":"Create Team","description":"Create a team. Requires active AppSumo Gold or Platinum license.","operationId":"create_team_api_v1_team_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTeamRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/team/members":{"get":{"tags":["team"],"summary":"List Members","description":"List all members of the current user's team.","operationId":"list_members_api_v1_team_members_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TeamMemberResponse"},"type":"array","title":"Response List Members Api V1 Team Members Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/team/invite":{"post":{"tags":["team"],"summary":"Invite Member","description":"Invite a member by email. Only the team owner can invite.","operationId":"invite_member_api_v1_team_invite_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteMemberRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamMemberResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/team/invite/{token}":{"get":{"tags":["team"],"summary":"Get Invite Info","description":"Get public info about a team invite. No auth required.\n\nUsed by the frontend to show \"You've been invited to join X's team\"\nbefore the user logs in or signs up.","operationId":"get_invite_info_api_v1_team_invite__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteInfoResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team/invite/{token}/accept":{"post":{"tags":["team"],"summary":"Accept Invite","description":"Accept a team invitation. Must be authenticated as the invited email.","operationId":"accept_invite_api_v1_team_invite__token__accept_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamMemberResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team/invite/{token}/decline":{"post":{"tags":["team"],"summary":"Decline Invite","description":"Decline a team invitation. Public endpoint (no auth required).","operationId":"decline_invite_api_v1_team_invite__token__decline_post","parameters":[{"name":"token","in":"path","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/team/members/{member_id}":{"delete":{"tags":["team"],"summary":"Remove Member","description":"Remove a member from the team. Only the team owner can remove members.","operationId":"remove_member_api_v1_team_members__member_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"integer","title":"Member Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/team/leave":{"post":{"tags":["team"],"summary":"Leave Team","description":"Leave the current team. Owner cannot leave (must delete team).","operationId":"leave_team_api_v1_team_leave_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/google-ads/generate":{"post":{"tags":["google-ads"],"summary":"Generate Keyword Plan","description":"Start Google Ads keyword strategy generation (async, pro users only).\n\nTriggers a background Celery task that:\n1. Gathers company profile data and competitor names\n2. Sends an enriched prompt to GPT-5.1 with web search\n3. Stores the resulting keyword plan in the database\n\nReturns a task_id for polling via GET /google-ads/status.","operationId":"generate_keyword_plan_api_v1_google_ads_generate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsGenerateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/google-ads/active-task":{"get":{"tags":["google-ads"],"summary":"Get Active Task","description":"Check if there is an active keyword generation task for the current user.\nRead-only — does not create a new task.\nUsed by the frontend to resume polling after a page reload.","operationId":"get_active_task_api_v1_google_ads_active_task_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-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/google-ads/status":{"get":{"tags":["google-ads"],"summary":"Check Keyword Plan Status","description":"Poll the status of a Google Ads keyword generation task.\n\nPass the task_id from the POST /generate response.\n\nReturns:\n- status='active': Generation is still in progress\n- status='completed': plan_id is populated, use dashboard endpoint to fetch data\n- status='failed': error contains the failure reason","operationId":"check_keyword_plan_status_api_v1_google_ads_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"query","required":true,"schema":{"type":"string","title":"Task Id"}},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/overview":{"get":{"tags":["analytics"],"summary":"Get Overview","operationId":"get_overview_api_v1_analytics_overview_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"user_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Tier"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyticsOverview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/generations/by-user":{"get":{"tags":["analytics"],"summary":"Get Generations By User","operationId":"get_generations_by_user_api_v1_analytics_generations_by_user_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"source","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Source"}},{"name":"user_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Tier"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserGenerationStat"},"title":"Response Get Generations By User Api V1 Analytics Generations By User Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/downloads/by-user":{"get":{"tags":["analytics"],"summary":"Get Downloads By User","operationId":"get_downloads_by_user_api_v1_analytics_downloads_by_user_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"source","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Source"}},{"name":"user_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Tier"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserDownloadStat"},"title":"Response Get Downloads By User Api V1 Analytics Downloads By User Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/generations/failed":{"get":{"tags":["analytics"],"summary":"Get Failed Generations","operationId":"get_failed_generations_api_v1_analytics_generations_failed_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"user_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Tier"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FailedGeneration"},"title":"Response Get Failed Generations Api V1 Analytics Generations Failed Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/generation-times":{"get":{"tags":["analytics"],"summary":"Get Generation Times","operationId":"get_generation_times_api_v1_analytics_generation_times_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"user_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Tier"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GenerationTimeStat"},"title":"Response Get Generation Times Api V1 Analytics Generation Times Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/templates/popularity":{"get":{"tags":["analytics"],"summary":"Get Template Popularity","operationId":"get_template_popularity_api_v1_analytics_templates_popularity_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"user_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Tier"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TemplatePopularity"},"title":"Response Get Template Popularity Api V1 Analytics Templates Popularity Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/signups":{"get":{"tags":["analytics"],"summary":"Get Signups","operationId":"get_signups_api_v1_analytics_signups_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupStats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/images/generated":{"get":{"tags":["analytics"],"summary":"Get Generated Images","operationId":"get_generated_images_api_v1_analytics_images_generated_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"source","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Source"}},{"name":"user_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Tier"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GeneratedImageRecord"},"title":"Response Get Generated Images Api V1 Analytics Images Generated Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/images/downloaded":{"get":{"tags":["analytics"],"summary":"Get Downloaded Images","operationId":"get_downloaded_images_api_v1_analytics_images_downloaded_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"source","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Source"}},{"name":"user_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Tier"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DownloadedImageRecord"},"title":"Response Get Downloaded Images Api V1 Analytics Images Downloaded Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/images/daily-counts":{"get":{"tags":["analytics"],"summary":"Get Daily Image Counts","operationId":"get_daily_image_counts_api_v1_analytics_images_daily_counts_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DailyCountBucket"},"title":"Response Get Daily Image Counts Api V1 Analytics Images Daily Counts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/signups/daily-counts":{"get":{"tags":["analytics"],"summary":"Get Daily Signup Counts","operationId":"get_daily_signup_counts_api_v1_analytics_signups_daily_counts_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DailyCountBucket"},"title":"Response Get Daily Signup Counts Api V1 Analytics Signups Daily Counts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/downloads/daily-counts":{"get":{"tags":["analytics"],"summary":"Get Daily Download Counts","operationId":"get_daily_download_counts_api_v1_analytics_downloads_daily_counts_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DailyCountBucket"},"title":"Response Get Daily Download Counts Api V1 Analytics Downloads Daily Counts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/paid-signups/daily-counts":{"get":{"tags":["analytics"],"summary":"Get Daily Paid Signup Counts","operationId":"get_daily_paid_signup_counts_api_v1_analytics_paid_signups_daily_counts_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DailyCountBucket"},"title":"Response Get Daily Paid Signup Counts Api V1 Analytics Paid Signups Daily Counts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/activations/daily-counts":{"get":{"tags":["analytics"],"summary":"Get Daily Activation Counts","operationId":"get_daily_activation_counts_api_v1_analytics_activations_daily_counts_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DailyCountBucket"},"title":"Response Get Daily Activation Counts Api V1 Analytics Activations Daily Counts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/events/time-series":{"get":{"tags":["analytics"],"summary":"Get Event Time Series","operationId":"get_event_time_series_api_v1_analytics_events_time_series_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"granularity","in":"query","required":false,"schema":{"type":"string","default":"day","title":"Granularity"}},{"name":"user_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Tier"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EventTimeSeriesBucket"},"title":"Response Get Event Time Series Api V1 Analytics Events Time Series Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/events/by-source":{"get":{"tags":["analytics"],"summary":"Get Events By Source","operationId":"get_events_by_source_api_v1_analytics_events_by_source_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"user_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Tier"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EventBySource"},"title":"Response Get Events By Source Api V1 Analytics Events By Source Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/events/funnel":{"get":{"tags":["analytics"],"summary":"Get Event Funnel","operationId":"get_event_funnel_api_v1_analytics_events_funnel_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"user_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Tier"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EventFunnelStep"},"title":"Response Get Event Funnel Api V1 Analytics Events Funnel Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/events/metadata-breakdown":{"get":{"tags":["analytics"],"summary":"Get Event Metadata Breakdown","operationId":"get_event_metadata_breakdown_api_v1_analytics_events_metadata_breakdown_get","parameters":[{"name":"event_type","in":"query","required":true,"schema":{"type":"string","title":"Event Type"}},{"name":"metadata_key","in":"query","required":true,"schema":{"type":"string","title":"Metadata Key"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"user_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Tier"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MetadataBreakdownRow"},"title":"Response Get Event Metadata Breakdown Api V1 Analytics Events Metadata Breakdown Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/events/user-engagement":{"get":{"tags":["analytics"],"summary":"Get User Engagement","operationId":"get_user_engagement_api_v1_analytics_events_user_engagement_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"user_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Tier"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserEngagementResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/events/raw":{"get":{"tags":["analytics"],"summary":"Get Raw Events","operationId":"get_raw_events_api_v1_analytics_events_raw_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"user_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Tier"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"event_source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Source"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RawEventResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/events/distinct-values":{"get":{"tags":["analytics"],"summary":"Get Event Distinct Values","operationId":"get_event_distinct_values_api_v1_analytics_events_distinct_values_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DistinctValues"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/retention/cohort-weekly":{"get":{"tags":["analytics"],"summary":"Get Cohort Retention","operationId":"get_cohort_retention_api_v1_analytics_retention_cohort_weekly_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"user_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Tier"}},{"name":"max_weeks","in":"query","required":false,"schema":{"type":"integer","default":52,"title":"Max Weeks"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohortRetentionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/retention/cohort-users":{"get":{"tags":["analytics"],"summary":"Get Cohort Users","operationId":"get_cohort_users_api_v1_analytics_retention_cohort_users_get","parameters":[{"name":"cohort_week","in":"query","required":true,"schema":{"type":"string","title":"Cohort Week"}},{"name":"user_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Tier"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohortUsersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/retention/cohort-week-active-users":{"get":{"tags":["analytics"],"summary":"Get Cohort Week Active Users","operationId":"get_cohort_week_active_users_api_v1_analytics_retention_cohort_week_active_users_get","parameters":[{"name":"cohort_week","in":"query","required":true,"schema":{"type":"string","title":"Cohort Week"}},{"name":"week_number","in":"query","required":true,"schema":{"type":"integer","title":"Week Number"}},{"name":"user_tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Tier"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CohortUsersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/download-gate/events":{"get":{"tags":["analytics"],"summary":"Get Download Gate Events","operationId":"get_download_gate_events_api_v1_analytics_download_gate_events_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DownloadGateEvent"},"title":"Response Get Download Gate Events Api V1 Analytics Download Gate Events Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/download-gate/country-summary":{"get":{"tags":["analytics"],"summary":"Get Download Gate Country Summary","operationId":"get_download_gate_country_summary_api_v1_analytics_download_gate_country_summary_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DownloadGateCountrySummary"},"title":"Response Get Download Gate Country Summary Api V1 Analytics Download Gate Country Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/onboarding/dropoff/summary":{"get":{"tags":["analytics"],"summary":"Get Onboarding Dropoff Summary","description":"Drop-off counts grouped by last step, sorted desc.","operationId":"get_onboarding_dropoff_summary_api_v1_analytics_onboarding_dropoff_summary_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OnboardingDropoffSummary"},"title":"Response Get Onboarding Dropoff Summary Api V1 Analytics Onboarding Dropoff Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/onboarding/dropoff/users":{"get":{"tags":["analytics"],"summary":"Get Onboarding Dropoff Users","description":"Individual drop-off users, searchable by email or user_id.","operationId":"get_onboarding_dropoff_users_api_v1_analytics_onboarding_dropoff_users_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OnboardingDropoffUser"},"title":"Response Get Onboarding Dropoff Users Api V1 Analytics Onboarding Dropoff Users Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/appsumo-users":{"get":{"tags":["analytics"],"summary":"Get Appsumo Users","description":"List all AppSumo licenses with linked user info, newest first.","operationId":"get_appsumo_users_api_v1_analytics_appsumo_users_get","parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppSumoUsersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/attribution/summary":{"get":{"tags":["analytics"],"summary":"Get Attribution Summary","description":"Channel attribution metrics grouped by source/medium/campaign.","operationId":"get_attribution_summary_api_v1_analytics_attribution_summary_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"group_by","in":"query","required":false,"schema":{"type":"string","description":"Group by: source, medium, or campaign","default":"source","title":"Group By"},"description":"Group by: source, medium, or campaign"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AttributionChannelRow"},"title":"Response Get Attribution Summary Api V1 Analytics Attribution Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analytics/turn-time/daily":{"get":{"tags":["analytics"],"summary":"Get Daily Avg Turn Time","operationId":"get_daily_avg_turn_time_api_v1_analytics_turn_time_daily_get","parameters":[{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start"}},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DailyCountBucket"},"title":"Response Get Daily Avg Turn Time Api V1 Analytics Turn Time Daily Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel-analytics/backfill-channels":{"post":{"tags":["pixel-analytics"],"summary":"Backfill Channels","description":"Classify `channel` for existing sessions (retroactive, idempotent).\n\nWrites, so it opens its own primary-DB session rather than the read\nreplica this router otherwise uses. Re-run until ``remaining`` is 0.","operationId":"backfill_channels_api_v1_pixel_analytics_backfill_channels_post","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":1,"default":20000,"title":"Limit"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel-analytics/clients":{"get":{"tags":["pixel-analytics"],"summary":"List Clients","description":"Active pixel keys with 7-day session counts, for the client switcher.","operationId":"list_clients_api_v1_pixel_analytics_clients_get","parameters":[{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel-analytics/overview":{"get":{"tags":["pixel-analytics"],"summary":"Pixel Overview","description":"Cross-client (or per-key) pixel overview for the admin dashboard.","operationId":"pixel_overview_api_v1_pixel_analytics_overview_get","parameters":[{"name":"key_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Pixel key id; omit for all clients","title":"Key Id"},"description":"Pixel key id; omit for all clients"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":7,"title":"Days"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/discover/feed":{"get":{"tags":["discover"],"summary":"Get Discover Feed","description":"Get a paginated page of discover feed images, personalized by user industry.","operationId":"get_discover_feed_api_v1_discover_feed_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"seed","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seed"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoverPageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-search/search":{"get":{"tags":["ad-search"],"summary":"Search Ads","description":"Search ad creatives with full-text search and filters.\n\n- **q**: Free-text search across descriptions, brands, ad copy, etc.\n- **ad_category**: Filter by category (Product Showcase, Sale Campaign, etc.)\n- **industry_vertical**: Filter by industry (Ecommerce, B2B SaaS, etc.)\n- **brand_name**: Filter by brand\n- **min_quality_score**: Minimum quality (1-10)\n- **sort_by**: Sort field, e.g. `quality_score:desc`","operationId":"search_ads_api_v1_ad_search_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"Search query","default":"","title":"Q"},"description":"Search query"},{"name":"ad_category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ad Category"}},{"name":"industry_vertical","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry Vertical"}},{"name":"brand_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Name"}},{"name":"has_human_faces","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Human Faces"}},{"name":"has_product_image","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Product Image"}},{"name":"has_logo","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Logo"}},{"name":"estimated_platform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimated Platform"}},{"name":"min_quality_score","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":10,"minimum":1},{"type":"null"}],"title":"Min Quality Score"}},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"e.g. quality_score:desc","title":"Sort By"},"description":"e.g. quality_score:desc"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdSearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ad-search/facets":{"get":{"tags":["ad-search"],"summary":"Get Ad Facets","description":"Get available filter options with counts.\n\nReturns all ad categories, industry verticals, brands, and platforms\nwith the number of ads in each.","operationId":"get_ad_facets_api_v1_ad_search_facets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdFacetsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/ad-search/template-images":{"get":{"tags":["ad-search"],"summary":"Get Template Images","description":"Get personalized template images for the current user (poll-friendly).","operationId":"get_template_images_api_v1_ad_search_template_images_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/ad-search/template-images/generate":{"post":{"tags":["ad-search"],"summary":"Generate Template Images","description":"Trigger personalized template image generation for the current user.","operationId":"generate_template_images_api_v1_ad_search_template_images_generate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/ad-search/{ad_id}":{"get":{"tags":["ad-search"],"summary":"Get Ad By Id","description":"Get a single ad creative by ID.","operationId":"get_ad_by_id_api_v1_ad_search__ad_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ad_id","in":"path","required":true,"schema":{"type":"string","title":"Ad Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdSearchHit"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/onboarding/record-step":{"post":{"tags":["onboarding"],"summary":"Record Step","description":"Record an onboarding step view for drop-off tracking.","operationId":"record_step_api_v1_onboarding_record_step_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingStepRecord"}}},"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/business-lookup/lookup":{"post":{"tags":["business-lookup"],"summary":"Lookup Business","description":"Search the web for a company and return up to 3 structured description options.\n\nUses Gemini with Google Search grounding to find what the company sells,\nwho their customers are, and the best official website match when available.\nFails open: any error returns empty descriptions list.\n\nThis endpoint does NOT require authentication so it can be used\nduring the onboarding flow before registration is complete.","operationId":"lookup_business_api_v1_business_lookup_lookup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LookupBusinessRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LookupBusinessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/validate-website":{"post":{"tags":["public"],"summary":"Validate Website","description":"Validate reachability of a website URL with SSRF guards enabled.","operationId":"validate_website_api_v1_public_validate_website_post","parameters":[{"name":"X-Public-Token","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Public-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateWebsiteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateWebsiteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/validate-name":{"post":{"tags":["public"],"summary":"Validate Name","description":"Check whether a business/company name is allowed.","operationId":"validate_name_api_v1_public_validate_name_post","parameters":[{"name":"X-Public-Token","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Public-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateNameRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateNameResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/slack":{"post":{"tags":["public"],"summary":"Post To Slack","description":"Post a lightweight notification to Slack (Origin-protected).","operationId":"post_to_slack_api_v1_public_slack_post","parameters":[{"name":"X-Public-Token","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Public-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BasicSuccessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/public/preview-image":{"post":{"tags":["public"],"summary":"Preview Image","description":"Fetch and return image previews (base64) with strict DoS guards.\n\nGuards:\n- max 100 images per request\n- max 10MB per image","operationId":"preview_image_api_v1_public_preview_image_post","parameters":[{"name":"X-Public-Token","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Public-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewImageRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewImageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/personas/generate":{"post":{"tags":["personas"],"summary":"Generate Personas","description":"Start persona generation (async).\n\nIf character_type is omitted, generates all 3 types in parallel via a Celery chord.\nIf character_type is provided, generates only that type (backward compat).\n\nReturns a task_id for polling via GET /personas/status.","operationId":"generate_personas_api_v1_personas_generate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"character_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Character type: humans, 2d, 3d, or omit for all","title":"Character Type"},"description":"Character type: humans, 2d, 3d, or omit for all"},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaGenerateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/personas/status":{"get":{"tags":["personas"],"summary":"Check Persona Status","description":"Poll the status of a persona generation task.\n\nIf character_type is omitted, returns combined characters from all 3 types.\n\nReturns:\n- status='active': Generation is still in progress\n- status='completed': characters array is populated\n- status='failed': error contains the failure reason","operationId":"check_persona_status_api_v1_personas_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"query","required":true,"schema":{"type":"string","title":"Task Id"}},{"name":"character_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Character type: humans, 2d, 3d, or omit for all","title":"Character Type"},"description":"Character type: humans, 2d, 3d, or omit for all"},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/personas/active-task":{"get":{"tags":["personas"],"summary":"Get Active Task","description":"Check if there is an active persona generation task, or return existing personas.\nIf character_type is omitted, returns combined characters from all 3 types.","operationId":"get_active_task_api_v1_personas_active_task_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"character_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Character type: humans, 2d, 3d, or omit for all","title":"Character Type"},"description":"Character type: humans, 2d, 3d, or omit for all"},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-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/personas/create-custom":{"post":{"tags":["personas"],"summary":"Create Custom Character","description":"Create a custom character from a free-form description (costs 1 credit).\n\nTriggers a background Celery task that:\n1. Calls LLM to generate structured character fields from description\n2. Generates an AI portrait image\n3. Appends the character to the user's existing characters\n4. Deducts 1 credit\n\nReturns a task_id for polling via GET /personas/status.","operationId":"create_custom_character_api_v1_personas_create_custom_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomCharacterRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonaGenerateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/content-agent/sessions":{"post":{"tags":["content-agent"],"summary":"Create Session","description":"Create an empty session and return its ID. Used by the frontend to get a real session URL before streaming.","operationId":"create_session_api_v1_content_agent_sessions_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["content-agent"],"summary":"List Sessions","description":"List all agent sessions for the user, newest first.","operationId":"list_sessions_api_v1_content_agent_sessions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-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/content-agent/chat/stream":{"post":{"tags":["content-agent"],"summary":"Agent Chat Stream","description":"Start a content agent turn and return immediately. Poll for progress.","operationId":"agent_chat_stream_api_v1_content_agent_chat_stream_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentChatRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/content-agent/chat/poll/{chat_request_id}":{"get":{"tags":["content-agent"],"summary":"Poll Turn Result","description":"Poll for turn progress / completed result.\n\nReturns:\n- {\"status\": \"running\", \"phases\": [...], ...} while in progress\n- {\"status\": \"completed\", \"response_text\": \"...\", ...} when done\n- {\"status\": \"error\", \"error_message\": \"...\"} on failure\n- 404 if the chat_request_id is unknown","operationId":"poll_turn_result_api_v1_content_agent_chat_poll__chat_request_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"chat_request_id","in":"path","required":true,"schema":{"type":"string","title":"Chat Request Id"}},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-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/content-agent/chat/active/{session_id}":{"get":{"tags":["content-agent"],"summary":"Get Active Turn","description":"Check if a turn is currently running for a session.\n\nReturns {\"chat_request_id\": \"...\"} if active, 404 otherwise.\nUsed by the frontend to resume polling after a page refresh.","operationId":"get_active_turn_api_v1_content_agent_chat_active__session_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-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/content-agent/upload-image":{"post":{"tags":["content-agent"],"summary":"Agent Upload Image","description":"Upload an image to the agent session.\nThe image is uploaded to S3 and its URL is stored in the session messages.\nThe agent can then analyze it via describe_image.","operationId":"agent_upload_image_api_v1_content_agent_upload_image_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_agent_upload_image_api_v1_content_agent_upload_image_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/content-agent/upload":{"post":{"tags":["content-agent"],"summary":"Agent Upload","description":"Upload a CSV file to the agent session.\nThe agent will parse and analyze it automatically.","operationId":"agent_upload_api_v1_content_agent_upload_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_agent_upload_api_v1_content_agent_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/content-agent/sessions/{session_id}":{"get":{"tags":["content-agent"],"summary":"Get Session","description":"Get a specific session with full message history.","operationId":"get_session_api_v1_content_agent_sessions__session_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-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/content-agent/batch/{batch_id}/items":{"get":{"tags":["content-agent"],"summary":"Get Batch Items","description":"Fetch content items for a batch_id — used by the frontend to populate the calendar save modal.","operationId":"get_batch_items_api_v1_content_agent_batch__batch_id__items_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-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/content-agent/calendars":{"post":{"tags":["content-agent"],"summary":"Create Calendar","description":"Persist a calendar after the user confirms in the frontend modal.","operationId":"create_calendar_api_v1_content_agent_calendars_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCalendarRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["content-agent"],"summary":"List Calendars","description":"List all content calendars for the user.","operationId":"list_calendars_api_v1_content_agent_calendars_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-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/content-agent/calendars/{calendar_id}":{"get":{"tags":["content-agent"],"summary":"Get Calendar","description":"Get a calendar with all its content items.","operationId":"get_calendar_api_v1_content_agent_calendars__calendar_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"calendar_id","in":"path","required":true,"schema":{"type":"integer","title":"Calendar Id"}},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-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/content-agent/calendars/{calendar_id}/items":{"get":{"tags":["content-agent"],"summary":"Get Calendar Items","description":"Get content items for a calendar, with optional filters.","operationId":"get_calendar_items_api_v1_content_agent_calendars__calendar_id__items_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"calendar_id","in":"path","required":true,"schema":{"type":"integer","title":"Calendar Id"}},{"name":"platform","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},{"name":"content_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-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/content-agent/items/{item_id}":{"get":{"tags":["content-agent"],"summary":"Get Content Item","description":"Get a single content item with full detail.","operationId":"get_content_item_api_v1_content_agent_items__item_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItemResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["content-agent"],"summary":"Update Content Item Endpoint","description":"Update a content item (creative prompt, copy, status, schedule, etc.).","operationId":"update_content_item_endpoint_api_v1_content_agent_items__item_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItemUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentItemResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/content-agent/items/{item_id}/generate":{"post":{"tags":["content-agent"],"summary":"Generate Item Image","description":"Generate the image for a single content item.","operationId":"generate_item_image_api_v1_content_agent_items__item_id__generate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"integer","title":"Item Id"}},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-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/content-agent/export":{"post":{"tags":["content-agent"],"summary":"Export Content","description":"Export content items as a downloadable ZIP package. Returns a presigned S3 URL.","operationId":"export_content_api_v1_content_agent_export_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/vibe-kits":{"get":{"tags":["vibe-kits","vibe-kits"],"summary":"List Vibe Kits","description":"Return all completed vibe kits, newest first.","operationId":"list_vibe_kits_api_v1_vibe_kits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VibeKitsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/friendvibes/public/discover":{"post":{"tags":["friendvibes"],"summary":"Discover Friendvibes","description":"Start friendvibes discovery for a lite user (pre-registration, no auth).\n\nCreates a session with user_id=NULL and kicks off async discovery + crawl.\nReturns session_id for polling.","operationId":"discover_friendvibes_api_v1_friendvibes_public_discover_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FriendvibesDiscoverRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FriendvibesDiscoverResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/friendvibes/public/status/{session_id}":{"get":{"tags":["friendvibes"],"summary":"Get Friendvibes Status","description":"Poll for friendvibes discovery status and results (no auth).","operationId":"get_friendvibes_status_api_v1_friendvibes_public_status__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"integer","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FriendvibesStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/friendvibes/claim":{"post":{"tags":["friendvibes"],"summary":"Claim Friendvibes Session","description":"Link a friendvibes session to the authenticated user (post-registration).","operationId":"claim_friendvibes_session_api_v1_friendvibes_claim_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FriendvibesClaimRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/friendvibes/selected-style":{"get":{"tags":["friendvibes"],"summary":"Get Selected Friendvibes Style","description":"Return the latest completed friendvibes session and its selected company.","operationId":"get_selected_friendvibes_style_api_v1_friendvibes_selected_style_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FriendvibesSelectedStyleResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/friendvibes/public/select":{"post":{"tags":["friendvibes"],"summary":"Select Friendvibes Company","description":"Save which company the user selected (pre-registration, no auth).\n\nExpects: {\"session_id\": int, \"company_id\": int | null}","operationId":"select_friendvibes_company_api_v1_friendvibes_public_select_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/knowledge-base":{"get":{"tags":["knowledge-base","knowledge-base"],"summary":"Get Knowledge Base","description":"Return the current knowledge base content for the user's latest company profile.","operationId":"get_knowledge_base_api_v1_knowledge_base_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["knowledge-base","knowledge-base"],"summary":"Update Knowledge Base","description":"Update the knowledge base (product_or_offering_understanding) for the user's\nlatest company profile. Logs the edit to knowledge_edit_history for auditing.","operationId":"update_knowledge_base_api_v1_knowledge_base_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateKnowledgeBaseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge-base/history":{"get":{"tags":["knowledge-base","knowledge-base"],"summary":"Get Knowledge Edit History","description":"Return paginated edit history for the user's knowledge base.","operationId":"get_knowledge_edit_history_api_v1_knowledge_base_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-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/knowledge-base/target-audiences":{"get":{"tags":["knowledge-base","knowledge-base"],"summary":"List Target Audiences","description":"List all target audiences for the user's latest company profile.","operationId":"list_target_audiences_api_v1_knowledge_base_target_audiences_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["knowledge-base","knowledge-base"],"summary":"Create Target Audience","description":"Add a new target audience to the user's latest company profile.","operationId":"create_target_audience_api_v1_knowledge_base_target_audiences_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTargetAudienceRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge-base/target-audiences/{audience_id}":{"put":{"tags":["knowledge-base","knowledge-base"],"summary":"Update Target Audience","description":"Update an existing target audience.","operationId":"update_target_audience_api_v1_knowledge_base_target_audiences__audience_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"audience_id","in":"path","required":true,"schema":{"type":"integer","title":"Audience Id"}},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-User-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTargetAudienceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["knowledge-base","knowledge-base"],"summary":"Delete Target Audience","description":"Soft-delete a target audience by setting is_active=False.","operationId":"delete_target_audience_api_v1_knowledge_base_target_audiences__audience_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"audience_id","in":"path","required":true,"schema":{"type":"integer","title":"Audience Id"}},{"name":"client_user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Client user ID to view data for","title":"Client User Id"},"description":"Client user ID to view data for"},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Lapis-Dev-Token"}},{"name":"x-assume-user-id","in":"header","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"X-Assume-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/seed-designs/":{"get":{"tags":["seed-designs"],"summary":"List Seed Designs","operationId":"list_seed_designs_api_v1_seed_designs__get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeedDesignListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["seed-designs"],"summary":"Create Seed Design","operationId":"create_seed_design_api_v1_seed_designs__post","parameters":[{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeedDesignCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeedDesignRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seed-designs/{seed_design_id}":{"get":{"tags":["seed-designs"],"summary":"Get Seed Design","operationId":"get_seed_design_api_v1_seed_designs__seed_design_id__get","parameters":[{"name":"seed_design_id","in":"path","required":true,"schema":{"type":"integer","title":"Seed Design Id"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeedDesignRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["seed-designs"],"summary":"Update Seed Design","operationId":"update_seed_design_api_v1_seed_designs__seed_design_id__put","parameters":[{"name":"seed_design_id","in":"path","required":true,"schema":{"type":"integer","title":"Seed Design Id"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeedDesignUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeedDesignRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["seed-designs"],"summary":"Delete Seed Design","operationId":"delete_seed_design_api_v1_seed_designs__seed_design_id__delete","parameters":[{"name":"seed_design_id","in":"path","required":true,"schema":{"type":"integer","title":"Seed Design Id"}},{"name":"delete_s3","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Delete S3"}},{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/seed-designs/upload":{"post":{"tags":["seed-designs"],"summary":"Upload Seed Design","operationId":"upload_seed_design_api_v1_seed_designs_upload_post","parameters":[{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_seed_design_api_v1_seed_designs_upload_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SeedDesignRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/openai-ads/drafts":{"get":{"tags":["openai-ads"],"summary":"List Drafts","description":"List OpenAI Ads drafts for the current user.","operationId":"list_drafts_api_v1_openai_ads_drafts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status (draft/approved/exported)","title":"Status"},"description":"Filter by status (draft/approved/exported)"},{"name":"batch_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by generation batch ID","title":"Batch Id"},"description":"Filter by generation batch ID"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAIAdsDraftListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/openai-ads/drafts/{draft_id}":{"get":{"tags":["openai-ads"],"summary":"Get Draft","description":"Get a single draft by ID.","operationId":"get_draft_api_v1_openai_ads_drafts__draft_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"integer","title":"Draft Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAIAdsDraftResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/openai-ads/export":{"get":{"tags":["openai-ads"],"summary":"Export Drafts","description":"Export drafts as CSV in OpenAI Ads Manager bulk upload format.","operationId":"export_drafts_api_v1_openai_ads_export_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","description":"Export drafts with this status","default":"approved","title":"Status"},"description":"Export drafts with this status"},{"name":"batch_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by batch ID","title":"Batch Id"},"description":"Filter by batch ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/openai-ads/export-zip":{"get":{"tags":["openai-ads"],"summary":"Export Drafts Zip","description":"Export drafts as a ZIP uploaded to S3. Returns a presigned download URL.","operationId":"export_drafts_zip_api_v1_openai_ads_export_zip_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","description":"Export drafts with this status","default":"approved","title":"Status"},"description":"Export drafts with this status"},{"name":"batch_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by batch ID","title":"Batch Id"},"description":"Filter by batch ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel/e":{"post":{"tags":["pixel"],"summary":"Ingest Event","description":"Ingest a pixel event from the JS snippet.\n\nPublic endpoint — called from client websites. No JWT auth required.\nValidated by the API key in the event payload.\nReturns 204 No Content (the snippet doesn't need a response body). A\nrejected event is still 204 so the snippet never errors; the reason is\nexposed in ``X-Lapis-Pixel-Rejected`` for anyone debugging an install.\n\nThe request path does no database or network work: the event is parsed,\nknown-invalid keys are dropped, and everything else is handed to the\nper-process ingest workers (``pixel_ingest_queue``), which validate the\nkey (cached), check the domain restriction, upsert the session, insert\nthe event and run the CAPI forwarding hooks off the request thread. The\nbeacon always gets its 204 within a millisecond, regardless of database\nlatency. The rejection header is derived from the in-process key cache\n(``PixelIngestQueue.rejection_reason``): exact for cached keys, absent\nwhile a key is still being validated on the unverified lane.","operationId":"ingest_event_api_v1_pixel_e_post","responses":{"204":{"description":"Successful Response"}}}},"/api/v1/pixel/keys":{"get":{"tags":["pixel"],"summary":"List Api Keys","description":"List all active pixel API keys for the authenticated user.","operationId":"list_api_keys_api_v1_pixel_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PixelApiKeyResponse"},"type":"array","title":"Response List Api Keys Api V1 Pixel Keys Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["pixel"],"summary":"Create Api Key","description":"Create a new pixel API key for the authenticated user.\n\nThe returned key (pk_...) should be embedded in the JS snippet\non the client's website.","operationId":"create_api_key_api_v1_pixel_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PixelApiKeyCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PixelApiKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/pixel/keys/{key_id}":{"delete":{"tags":["pixel"],"summary":"Revoke Api Key","description":"Deactivate a pixel API key.","operationId":"revoke_api_key_api_v1_pixel_keys__key_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel/credentials":{"get":{"tags":["pixel"],"summary":"Get Pixel Credentials","description":"Return the user's primary pixel key + Conversion API key.\n\nCreates both lazily on first call, so the dashboard settings page can\nalways show a working snippet. Uses the write session because of the\nlazy creation.","operationId":"get_pixel_credentials_api_v1_pixel_credentials_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PixelCredentialsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/pixel/server-keys":{"get":{"tags":["pixel"],"summary":"List Server Api Keys","description":"List active server events keys for the authenticated user.","operationId":"list_server_api_keys_api_v1_pixel_server_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PixelServerApiKeyResponse"},"type":"array","title":"Response List Server Api Keys Api V1 Pixel Server Keys Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["pixel"],"summary":"Create Server Api Key","description":"Create a backend-only server events key.\n\nThe raw secret is returned once as ``secret_key``. Store it in the client\nbackend environment; never expose it in browser or mobile code.","operationId":"create_server_api_key_api_v1_pixel_server_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PixelServerApiKeyCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PixelServerApiKeyCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/pixel/server-keys/{key_id}/reveal":{"get":{"tags":["pixel"],"summary":"Reveal Server Api Key","description":"Re-display a stored server key secret to its owner.\n\n``secret_key`` is null for keys created before encrypted storage existed.","operationId":"reveal_server_api_key_api_v1_pixel_server_keys__key_id__reveal_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PixelServerApiKeyRevealResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel/server-keys/{key_id}":{"delete":{"tags":["pixel"],"summary":"Revoke Server Api Key","description":"Deactivate a server events key.","operationId":"revoke_server_api_key_api_v1_pixel_server_keys__key_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel/enterprise-credentials/{company_slug}":{"get":{"tags":["pixel"],"summary":"Enterprise Pixel Credentials","description":"Default pixel + Conversion API key pair, lazily provisioned.","operationId":"enterprise_pixel_credentials_api_v1_pixel_enterprise_credentials__company_slug__get","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PixelCredentialsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel/enterprise/{company_slug}/keys":{"get":{"tags":["pixel"],"summary":"Enterprise List Keys","description":"All active pixel keys for the account.","operationId":"enterprise_list_keys_api_v1_pixel_enterprise__company_slug__keys_get","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PixelApiKeyResponse"},"title":"Response Enterprise List Keys Api V1 Pixel Enterprise  Company Slug  Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["pixel"],"summary":"Enterprise Create Key","description":"Create an additional pixel key (e.g. per site or environment).","operationId":"enterprise_create_key_api_v1_pixel_enterprise__company_slug__keys_post","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PixelApiKeyCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PixelApiKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel/enterprise/{company_slug}/keys/{key_id}":{"delete":{"tags":["pixel"],"summary":"Enterprise Revoke Key","description":"Revoke a pixel key (cascades to its scoped server keys).","operationId":"enterprise_revoke_key_api_v1_pixel_enterprise__company_slug__keys__key_id__delete","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel/enterprise/{company_slug}/server-keys":{"get":{"tags":["pixel"],"summary":"Enterprise List Server Keys","description":"All active Conversion API keys for the account.","operationId":"enterprise_list_server_keys_api_v1_pixel_enterprise__company_slug__server_keys_get","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PixelServerApiKeyResponse"},"title":"Response Enterprise List Server Keys Api V1 Pixel Enterprise  Company Slug  Server Keys Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["pixel"],"summary":"Enterprise Create Server Key","description":"Create a Conversion API key, optionally scoped to a pixel key.","operationId":"enterprise_create_server_key_api_v1_pixel_enterprise__company_slug__server_keys_post","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PixelServerApiKeyCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PixelServerApiKeyCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel/enterprise/{company_slug}/server-keys/{key_id}/reveal":{"get":{"tags":["pixel"],"summary":"Enterprise Reveal Server Key","description":"Re-display a stored Conversion API secret.","operationId":"enterprise_reveal_server_key_api_v1_pixel_enterprise__company_slug__server_keys__key_id__reveal_get","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PixelServerApiKeyRevealResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel/enterprise/{company_slug}/server-keys/{key_id}":{"delete":{"tags":["pixel"],"summary":"Enterprise Revoke Server Key","description":"Revoke a Conversion API key.","operationId":"enterprise_revoke_server_key_api_v1_pixel_enterprise__company_slug__server_keys__key_id__delete","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}},{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel/enterprise/{company_slug}/recent-events":{"get":{"tags":["pixel"],"summary":"Enterprise Recent Events","description":"Recent events + last-seen timestamp for pixel verification.","operationId":"enterprise_recent_events_api_v1_pixel_enterprise__company_slug__recent_events_get","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","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/pixel/enterprise/{company_slug}/analytics":{"get":{"tags":["pixel"],"summary":"Enterprise Pixel Analytics","description":"Customer-safe session analytics for one acquisition channel.","operationId":"enterprise_pixel_analytics_api_v1_pixel_enterprise__company_slug__analytics_get","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Days"}},{"name":"channel","in":"query","required":false,"schema":{"type":"string","default":"chatgpt","title":"Channel"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel/dev/provision":{"post":{"tags":["pixel"],"summary":"Dev Provision Pixel","description":"Provision a pk_ + scoped sk_live_ pair for a client account by email.\n\nInternal tool for onboarding: keys land under the *target user's* account\n(the multi-tenancy boundary), while auth is the dev's own token — no\nclient password or JWT needed. Idempotent: reuses an active pixel key for\nthe same domain/label and an active scoped server key when its secret is\nre-displayable; pass ``new_server_key`` to force a fresh secret.","operationId":"dev_provision_pixel_api_v1_pixel_dev_provision_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PixelDevProvisionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PixelDevProvisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/pixel/server-events":{"post":{"tags":["pixel"],"summary":"Ingest Server Event","description":"Ingest canonical Lapis events or an OpenAI-compatible event batch.","operationId":"ingest_server_event_api_v1_pixel_server_events_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PixelServerEventIn"},{"$ref":"#/components/schemas/PixelOpenAIEventBatchIn"}],"title":"Event"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PixelServerEventResponse"},{"$ref":"#/components/schemas/PixelServerEventBatchResponse"}],"title":"Response Ingest Server Event Api V1 Pixel Server Events Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel/openai-capi/credentials":{"get":{"tags":["pixel"],"summary":"List Openai Capi Credentials","description":"List stored OpenAI CAPI credentials with the API key masked.","operationId":"list_openai_capi_credentials_api_v1_pixel_openai_capi_credentials_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/OpenAICapiCredentialResponse"},"type":"array","title":"Response List Openai Capi Credentials Api V1 Pixel Openai Capi Credentials Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["pixel"],"summary":"Create Openai Capi Credential","description":"Store an OpenAI Ads pixel ID + Conversions API key (encrypted at rest).\n\nOnce stored with ``forward_server_events`` enabled, matched Lapis server\nevents are automatically forwarded to the OpenAI Conversions API.","operationId":"create_openai_capi_credential_api_v1_pixel_openai_capi_credentials_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAICapiCredentialCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAICapiCredentialResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/pixel/openai-capi/credentials/{credential_id}/reveal":{"get":{"tags":["pixel"],"summary":"Reveal Openai Capi Credential","description":"Re-display the stored OpenAI CAPI key to its owner.","operationId":"reveal_openai_capi_credential_api_v1_pixel_openai_capi_credentials__credential_id__reveal_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"integer","title":"Credential Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenAICapiCredentialRevealResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel/openai-capi/credentials/{credential_id}":{"delete":{"tags":["pixel"],"summary":"Revoke Openai Capi Credential","description":"Deactivate an OpenAI CAPI credential (stops event forwarding).","operationId":"revoke_openai_capi_credential_api_v1_pixel_openai_capi_credentials__credential_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"integer","title":"Credential Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel/meta-capi/credentials":{"get":{"tags":["pixel"],"summary":"List Meta Capi Credentials","operationId":"list_meta_capi_credentials_api_v1_pixel_meta_capi_credentials_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/MetaCapiCredentialResponse"},"type":"array","title":"Response List Meta Capi Credentials Api V1 Pixel Meta Capi Credentials Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["pixel"],"summary":"Create Meta Capi Credential","description":"Store a Meta dataset/access token and explicit server-event mapping.","operationId":"create_meta_capi_credential_api_v1_pixel_meta_capi_credentials_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaCapiCredentialCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaCapiCredentialResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/pixel/meta-capi/credentials/{credential_id}/reveal":{"get":{"tags":["pixel"],"summary":"Reveal Meta Capi Credential","operationId":"reveal_meta_capi_credential_api_v1_pixel_meta_capi_credentials__credential_id__reveal_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"integer","title":"Credential Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaCapiCredentialRevealResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel/meta-capi/credentials/{credential_id}":{"delete":{"tags":["pixel"],"summary":"Revoke Meta Capi Credential","operationId":"revoke_meta_capi_credential_api_v1_pixel_meta_capi_credentials__credential_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"integer","title":"Credential Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel/funnel":{"get":{"tags":["pixel"],"summary":"Get Funnel","description":"Return funnel metrics: sessions -> page views -> conversions -> revenue.\n\nGrouped by campaign (and optionally ad group).\nUse start_date/end_date for date range filtering (ISO format).\nAd-attributed sessions only unless include_organic=true.","operationId":"get_funnel_api_v1_pixel_funnel_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"campaign","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign"}},{"name":"ad_group","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ad Group"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"include_organic","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Organic"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PixelFunnelResponse"},"title":"Response Get Funnel Api V1 Pixel Funnel Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel/attribution":{"get":{"tags":["pixel"],"summary":"Get Attribution","description":"Return attribution data per campaign/ad_group/ad.\n\nIncludes sessions, conversions, revenue, and conversion rate.\nAd-attributed sessions only unless include_organic=true.","operationId":"get_attribution_api_v1_pixel_attribution_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"include_organic","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Organic"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PixelAttributionRow"},"title":"Response Get Attribution Api V1 Pixel Attribution Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pixel/events":{"get":{"tags":["pixel"],"summary":"Get Event Summary","description":"Return event-level counts grouped by event type and attribution fields.","operationId":"get_event_summary_api_v1_pixel_events_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}},{"name":"campaign","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PixelEventSummaryRow"},"title":"Response Get Event Summary Api V1 Pixel Events Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/create-service-token":{"post":{"tags":["slack-integration"],"summary":"Create Service Token","description":"Create a long-lived API token for service integrations (Slack bot, etc.).\n\nReturns a scoped JWT that expires in 365 days. The token carries a\n``scope: slack_service`` claim so it can only authenticate against\nslack-specific endpoints, not the full API.","operationId":"create_service_token_api_v1_auth_create_service_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceTokenResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/integrations/slack/link-user":{"post":{"tags":["slack-integration"],"summary":"Link Slack User","description":"Link a Slack user to their Lapis account.\n\nCalled from the Lapis dashboard after the user logs in and confirms the link.\nGenerates a scoped service token that the Slack bot will use.\n\nThe frontend passes the slack_user_id and slack_team_id from the\nOAuth state that was encoded in the Link Account URL.","operationId":"link_slack_user_api_v1_integrations_slack_link_user_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackLinkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackLinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/v1/chatgpt-ads/daily-pipeline":{"post":{"tags":["chatgpt-ads"],"summary":"Trigger Daily Pipeline","description":"Trigger the full daily pipeline for all active ChatGPT Ads accounts:\ndownload daily CSV → import → analyze → generate report → email.\n\nRequires X-Lapis-Dev-Token header.","operationId":"trigger_daily_pipeline_api_v1_chatgpt_ads_daily_pipeline_post","parameters":[{"name":"x-lapis-dev-token","in":"header","required":false,"schema":{"type":"string","title":"X-Lapis-Dev-Token"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DailyPipelineResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chatgpt-ads/public/account/{company_slug}":{"get":{"tags":["chatgpt-ads"],"summary":"Public Account","description":"Return ONLY public metadata for one client — no secret.\n\nThis endpoint returns display metadata only; it never exposes\n``chatgpt_ads_client_accounts.dashboard_secret``.","operationId":"public_account_api_v1_chatgpt_ads_public_account__company_slug__get","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chatgpt-ads/public/reports/{company_slug}":{"get":{"tags":["chatgpt-ads"],"summary":"Public List Reports","description":"List launched runs for a client, newest first.\n\nOnly returns rows with a ``run_slug`` assigned — launched runs in\nstatus ``ready`` / ``published`` / ``live``.","operationId":"public_list_reports_api_v1_chatgpt_ads_public_reports__company_slug__get","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chatgpt-ads/public/reports/{company_slug}/{run_slug}":{"get":{"tags":["chatgpt-ads"],"summary":"Public Get Report","description":"Return the compiled ``ReportData`` JSON for one run.","operationId":"public_get_report_api_v1_chatgpt_ads_public_reports__company_slug___run_slug__get","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}},{"name":"run_slug","in":"path","required":true,"schema":{"type":"string","title":"Run Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chatgpt-ads/public/products/{company_slug}":{"get":{"tags":["chatgpt-ads"],"summary":"Public List Products","description":"List a company's ChatGPT Ads product catalog.\n\nUnauth'd read of whatever is in the table.","operationId":"public_list_products_api_v1_chatgpt_ads_public_products__company_slug__get","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["chatgpt-ads"],"summary":"Public Create Product","description":"Create a new product row.\n\nRequires the company shared auth password in ``X-Auth-Password`` when\none is configured.","operationId":"public_create_product_api_v1_chatgpt_ads_public_products__company_slug__post","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}},{"name":"x-auth-password","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Auth-Password"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCreateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chatgpt-ads/experiments":{"get":{"tags":["chatgpt-ads"],"summary":"List Experiments","description":"List all experiments for the current user.","operationId":"list_experiments_api_v1_chatgpt_ads_experiments_get","security":[{"HTTPBearer":[]}],"parameters":[{"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/chatgpt-ads/experiments/{experiment_id}":{"get":{"tags":["chatgpt-ads"],"summary":"Get Experiment","description":"Get experiment details with summary.","operationId":"get_experiment_api_v1_chatgpt_ads_experiments__experiment_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"experiment_id","in":"path","required":true,"schema":{"type":"integer","title":"Experiment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chatgpt-ads/experiments/{experiment_id}/analysis":{"get":{"tags":["chatgpt-ads"],"summary":"Get Latest Analysis","description":"Get the latest analysis report for an experiment.","operationId":"get_latest_analysis_api_v1_chatgpt_ads_experiments__experiment_id__analysis_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"experiment_id","in":"path","required":true,"schema":{"type":"integer","title":"Experiment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chatgpt-ads/experiments/{experiment_id}/schema.xlsx":{"get":{"tags":["chatgpt-ads"],"summary":"Download Schema","description":"Download xlsx schema for Ads Manager upload.","operationId":"download_schema_api_v1_chatgpt_ads_experiments__experiment_id__schema_xlsx_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"experiment_id","in":"path","required":true,"schema":{"type":"integer","title":"Experiment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/chatgpt-ads/learnings":{"get":{"tags":["chatgpt-ads"],"summary":"List Learnings","description":"List all active learnings for the current user.","operationId":"list_learnings_api_v1_chatgpt_ads_learnings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"include_global","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Global"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enterprise/agreements/template":{"get":{"tags":["enterprise-agreements"],"summary":"Get Template","description":"A specific signed revision by ``definition_id``, else the current onboarding agreement.","operationId":"get_template_api_v1_enterprise_agreements_template_get","parameters":[{"name":"definition_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Definition Id"}},{"name":"ad_buyer","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Ad Buyer"}},{"name":"discount_percentage","in":"query","required":false,"schema":{"anyOf":[{"type":"number","exclusiveMaximum":100,"exclusiveMinimum":0},{"type":"null"}],"title":"Discount Percentage"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enterprise/agreements/invites":{"post":{"tags":["enterprise-agreements"],"summary":"Create Invite","operationId":"create_invite_api_v1_enterprise_agreements_invites_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["enterprise-agreements"],"summary":"List Invites","operationId":"list_invites_api_v1_enterprise_agreements_invites_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitesList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enterprise/agreements/invites/by-token/{token}":{"get":{"tags":["enterprise-agreements"],"summary":"Resolve Invite","operationId":"resolve_invite_api_v1_enterprise_agreements_invites_by_token__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteResolved"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enterprise/agreements/invites/by-token/{token}/site-checks":{"get":{"tags":["enterprise-agreements"],"summary":"Latest Site Checks","operationId":"latest_site_checks_api_v1_enterprise_agreements_invites_by_token__token__site_checks_get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteChecksLatest"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["enterprise-agreements"],"summary":"Request Site Check","operationId":"request_site_check_api_v1_enterprise_agreements_invites_by_token__token__site_checks_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCheckRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCheckOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enterprise/agreements/invites/{public_id}/site-checks":{"get":{"tags":["enterprise-agreements"],"summary":"Sales Site Checks","description":"Sales view of an invite's checks, by invite id rather than the customer token.","operationId":"sales_site_checks_api_v1_enterprise_agreements_invites__public_id__site_checks_get","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Public Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteChecksLatest"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enterprise/agreements/invites/{public_id}/site-profile.md":{"get":{"tags":["enterprise-agreements"],"summary":"Sales Site Profile Markdown","description":"The site profile as Markdown for the pre-call brief.","operationId":"sales_site_profile_markdown_api_v1_enterprise_agreements_invites__public_id__site_profile_md_get","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Public Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enterprise/agreements/invites/by-token/{token}/site-checks/{public_id}":{"get":{"tags":["enterprise-agreements"],"summary":"Get Site Check","operationId":"get_site_check_api_v1_enterprise_agreements_invites_by_token__token__site_checks__public_id__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"public_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Public Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteCheckOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enterprise/agreements/invites/{public_id}/revoke":{"post":{"tags":["enterprise-agreements"],"summary":"Revoke Invite","operationId":"revoke_invite_api_v1_enterprise_agreements_invites__public_id__revoke_post","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Public Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enterprise/agreements/onboarding":{"post":{"tags":["enterprise-agreements"],"summary":"Submit Onboarding","operationId":"submit_onboarding_api_v1_enterprise_agreements_onboarding_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_submit_onboarding_api_v1_enterprise_agreements_onboarding_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingSubmitted"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enterprise/agreements/company-contracts/{company_slug}":{"get":{"tags":["enterprise-agreements"],"summary":"Get Company Contract","operationId":"get_company_contract_api_v1_enterprise_agreements_company_contracts__company_slug__get","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgreementDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["enterprise-agreements"],"summary":"Create Company Contract","operationId":"create_company_contract_api_v1_enterprise_agreements_company_contracts__company_slug__post","parameters":[{"name":"company_slug","in":"path","required":true,"schema":{"type":"string","title":"Company Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyContractRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgreementDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enterprise/agreements":{"get":{"tags":["enterprise-agreements"],"summary":"List Agreements","operationId":"list_agreements_api_v1_enterprise_agreements_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgreementsList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enterprise/agreements/{public_id}":{"get":{"tags":["enterprise-agreements"],"summary":"Get Agreement","operationId":"get_agreement_api_v1_enterprise_agreements__public_id__get","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Public Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgreementDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enterprise/agreements/{public_id}/pdf":{"get":{"tags":["enterprise-agreements"],"summary":"Get Agreement Pdf","operationId":"get_agreement_pdf_api_v1_enterprise_agreements__public_id__pdf_get","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Public Id"}},{"name":"version","in":"query","required":false,"schema":{"type":"string","default":"client","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enterprise/agreements/{public_id}/logo":{"get":{"tags":["enterprise-agreements"],"summary":"Get Agreement Logo","operationId":"get_agreement_logo_api_v1_enterprise_agreements__public_id__logo_get","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Public Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enterprise/agreements/{public_id}/countersign":{"post":{"tags":["enterprise-agreements"],"summary":"Countersign","operationId":"countersign_api_v1_enterprise_agreements__public_id__countersign_post","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Public Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountersignRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgreementDetail"}}}},"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":{}}}}}}},"/":{"get":{"summary":"Root","description":"Root endpoint","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sentry-debug":{"get":{"summary":"Trigger Error","operationId":"trigger_error_sentry_debug_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AdCampaignAdResponse":{"properties":{"id":{"type":"integer","title":"Id"},"headline":{"type":"string","title":"Headline"},"subtext":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subtext"},"intro_text":{"type":"string","title":"Intro Text"},"creative_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creative Prompt"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"creative_image":{"anyOf":[{"$ref":"#/components/schemas/AdCreativeImageResponse"},{"type":"null"}]}},"type":"object","required":["id","headline","intro_text","created_at"],"title":"AdCampaignAdResponse","description":"Individual ad within a campaign."},"AdCampaignResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"objective":{"type":"string","title":"Objective"},"reason":{"type":"string","title":"Reason"},"target_audience":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Target Audience"},"target_audience_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Audience Summary"},"target_audience_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Audience Description"},"ads":{"items":{"$ref":"#/components/schemas/AdCampaignAdResponse"},"type":"array","title":"Ads"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"performance_forecast":{"anyOf":[{"$ref":"#/components/schemas/PerformanceForecastResponse"},{"type":"null"}]}},"type":"object","required":["id","objective","reason","ads","created_at"],"title":"AdCampaignResponse","description":"Individual campaign within a company profile."},"AdCreativeImageResponse":{"properties":{"status":{"type":"string","title":"Status"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"generation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Generation Id"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","required":["status"],"title":"AdCreativeImageResponse","description":"Creative image details for an ad."},"AdFacetsResponse":{"properties":{"ad_categories":{"additionalProperties":{"type":"integer"},"type":"object","title":"Ad Categories"},"industry_verticals":{"additionalProperties":{"type":"integer"},"type":"object","title":"Industry Verticals"},"brands":{"additionalProperties":{"type":"integer"},"type":"object","title":"Brands"},"platforms":{"additionalProperties":{"type":"integer"},"type":"object","title":"Platforms"},"total_ads":{"type":"integer","title":"Total Ads"}},"type":"object","required":["ad_categories","industry_verticals","brands","platforms","total_ads"],"title":"AdFacetsResponse","description":"Available filter options with counts."},"AdImageResponse":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"url":{"type":"string","title":"Url"},"aspect_ratio":{"$ref":"#/components/schemas/AspectRatio"},"creative_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creative Prompt"},"saphire_generation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Saphire Generation Id"},"status":{"$ref":"#/components/schemas/AdImageStatus"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"image_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Image Metadata"},"source_image_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Source Image Id","description":"ID of the source image this was resized from. None if this IS a source image."},"is_source_image":{"type":"boolean","title":"Is Source Image","description":"True if this is a source image (not resized from another)","default":true},"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","url","aspect_ratio","status","created_at","updated_at"],"title":"AdImageResponse","description":"Response schema for a single ad image."},"AdImageStatus":{"type":"string","enum":["pending","generating","completed","failed"],"title":"AdImageStatus","description":"Image generation status."},"AdImagesBatchResponse":{"properties":{"ads":{"additionalProperties":{"$ref":"#/components/schemas/AdImagesListResponse"},"type":"object","title":"Ads","description":"Map of ad_id to images list response"},"total_ads":{"type":"integer","title":"Total Ads","description":"Total number of ads returned"},"requested_ids":{"items":{"type":"integer"},"type":"array","title":"Requested Ids","description":"IDs that were requested"},"missing_ids":{"items":{"type":"integer"},"type":"array","title":"Missing Ids","description":"IDs that were not found or user lacks permission"}},"type":"object","required":["ads","total_ads","requested_ids"],"title":"AdImagesBatchResponse","description":"Response schema for batch fetching images for multiple ads."},"AdImagesListResponse":{"properties":{"ad_id":{"type":"integer","title":"Ad Id"},"total":{"type":"integer","title":"Total"},"images":{"items":{"$ref":"#/components/schemas/AdImageResponse"},"type":"array","title":"Images"},"primary_image":{"anyOf":[{"$ref":"#/components/schemas/AdImageResponse"},{"type":"null"}],"description":"The primary image for this ad"}},"type":"object","required":["ad_id","total","images"],"title":"AdImagesListResponse","description":"Response schema for listing ad images."},"AdSearchHit":{"properties":{"id":{"type":"string","title":"Id"},"filename":{"type":"string","title":"Filename"},"s3_url":{"type":"string","title":"S3 Url"},"image_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Description"},"brand_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Name"},"brand_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Description"},"product_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Name"},"product_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Description"},"target_audience":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Audience"},"ad_copy_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ad Copy Text"},"call_to_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Call To Action"},"color_palette":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Color Palette"},"ad_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ad Category"},"ad_category_confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ad Category Confidence"},"secondary_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secondary Category"},"industry_vertical":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry Vertical"},"industry_confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Industry Confidence"},"visual_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visual Style"},"has_human_faces":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Human Faces"},"has_product_image":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Product Image"},"has_logo":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Logo"},"estimated_platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimated Platform"},"quality_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quality Score"}},"type":"object","required":["id","filename","s3_url"],"title":"AdSearchHit","description":"A single search result."},"AdSearchResponse":{"properties":{"hits":{"items":{"$ref":"#/components/schemas/AdSearchHit"},"type":"array","title":"Hits"},"query":{"type":"string","title":"Query"},"total_hits":{"type":"integer","title":"Total Hits"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"processing_time_ms":{"type":"integer","title":"Processing Time Ms"},"facets":{"anyOf":[{"additionalProperties":{"additionalProperties":{"type":"integer"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Facets"}},"type":"object","required":["hits","query","total_hits","limit","offset","processing_time_ms"],"title":"AdSearchResponse","description":"Paginated search response."},"AdStoryBeatSchema":{"properties":{"beat":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beat"},"idea":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idea"}},"type":"object","title":"AdStoryBeatSchema","description":"A single story beat in an ad micro-story."},"AddStyleReferenceRequest":{"properties":{"image_base64":{"type":"string","title":"Image Base64","description":"Base64-encoded reference image"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format","description":"Image format (png, jpg, webp)","default":"png"}},"type":"object","required":["image_base64"],"title":"AddStyleReferenceRequest","description":"Request to add a single style reference image."},"AddStyleReferenceResponse":{"properties":{"id":{"type":"integer","title":"Id"},"s3_url":{"type":"string","title":"S3 Url"},"display_order":{"type":"integer","title":"Display Order"},"is_logo":{"type":"boolean","title":"Is Logo","default":false},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","s3_url","display_order"],"title":"AddStyleReferenceResponse","description":"Response from adding a style reference."},"AdsStudioDismissEventRequest":{"properties":{"notification":{"type":"string","enum":["welcome_modal","complete_notice"],"title":"Notification","description":"Notification type to dismiss"}},"type":"object","required":["notification"],"title":"AdsStudioDismissEventRequest","description":"Request model to mark one Ads Studio notification as dismissed."},"AdsStudioDismissalStatusResponse":{"properties":{"welcome_dismissed":{"type":"boolean","title":"Welcome Dismissed","description":"Whether Ads Studio welcome modal was dismissed"},"complete_notice_dismissed":{"type":"boolean","title":"Complete Notice Dismissed","description":"Whether Ads Studio completion notice was dismissed"},"welcome_dismissed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Welcome Dismissed At","description":"When welcome modal was dismissed"},"complete_notice_dismissed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Complete Notice Dismissed At","description":"When completion notice was dismissed"}},"type":"object","required":["welcome_dismissed","complete_notice_dismissed"],"title":"AdsStudioDismissalStatusResponse","description":"Response model for Ads Studio dismissal status."},"AgentChatRequest":{"properties":{"message":{"type":"string","maxLength":5000,"title":"Message"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"context":{"anyOf":[{"items":{"$ref":"#/components/schemas/app__api__endpoints__content_agent__ChipContext"},"type":"array"},{"type":"null"}],"title":"Context"},"language":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Language"},"aspect_ratio":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Aspect Ratio"},"free_generation":{"type":"boolean","title":"Free Generation","default":false},"hidden":{"type":"boolean","title":"Hidden","default":false}},"type":"object","required":["message"],"title":"AgentChatRequest"},"AgentContextInput":{"properties":{"target_audience":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Target Audience","description":"Target audience description and demographics"},"product_info":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Product Info","description":"Product/service understanding information"},"brand_guidelines":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Brand Guidelines","description":"Brand colors, fonts, and style guidelines"},"intro_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Intro Text","description":"Ad intro text / copy context"},"reference_images":{"items":{"type":"string"},"type":"array","title":"Reference Images","description":"S3 URLs of brand reference images"},"aspect_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect Ratio","description":"Default aspect ratio for image generation (e.g., '1:1', '16:9', '4:5', '9:16')"},"resolution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution","description":"Image resolution (e.g., '1K', '2K', '4K')"},"reference_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Reference Ids","description":"Specific manual reference IDs to use for generation. If not provided, all references are used."},"frontend_context":{"anyOf":[{"$ref":"#/components/schemas/FrontendSessionContext"},{"type":"null"}],"description":"Frontend session context (chips, memory, platform, language, etc.)"}},"type":"object","title":"AgentContextInput","description":"Input schema for agent context override."},"AgreementDetail":{"properties":{"public_id":{"type":"string","format":"uuid","title":"Public Id"},"source":{"type":"string","title":"Source"},"status":{"type":"string","title":"Status"},"company_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"},"company_name":{"type":"string","title":"Company Name"},"signer_name":{"type":"string","title":"Signer Name"},"signer_email":{"type":"string","title":"Signer Email"},"signer_title":{"type":"string","title":"Signer Title"},"platforms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Platforms"},"minimum_monthly_commitment_usd":{"type":"string","title":"Minimum Monthly Commitment Usd"},"has_logo":{"type":"boolean","title":"Has Logo"},"logo_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Filename"},"client_signed_at":{"type":"string","format":"date-time","title":"Client Signed At"},"provider_signed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Provider Signed At"},"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"},"submission":{"additionalProperties":true,"type":"object","title":"Submission"},"onboarding_details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Onboarding Details"},"pixel_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pixel Key"}},"type":"object","required":["public_id","source","status","company_slug","company_name","signer_name","signer_email","signer_title","platforms","minimum_monthly_commitment_usd","has_logo","logo_filename","client_signed_at","provider_signed_at","created_at","updated_at","submission","onboarding_details","pixel_key"],"title":"AgreementDetail"},"AgreementSummary":{"properties":{"public_id":{"type":"string","format":"uuid","title":"Public Id"},"source":{"type":"string","title":"Source"},"status":{"type":"string","title":"Status"},"company_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Slug"},"company_name":{"type":"string","title":"Company Name"},"signer_name":{"type":"string","title":"Signer Name"},"signer_email":{"type":"string","title":"Signer Email"},"signer_title":{"type":"string","title":"Signer Title"},"platforms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Platforms"},"minimum_monthly_commitment_usd":{"type":"string","title":"Minimum Monthly Commitment Usd"},"has_logo":{"type":"boolean","title":"Has Logo"},"logo_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Filename"},"client_signed_at":{"type":"string","format":"date-time","title":"Client Signed At"},"provider_signed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Provider Signed At"},"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":["public_id","source","status","company_slug","company_name","signer_name","signer_email","signer_title","platforms","minimum_monthly_commitment_usd","has_logo","logo_filename","client_signed_at","provider_signed_at","created_at","updated_at"],"title":"AgreementSummary"},"AgreementsList":{"properties":{"agreements":{"items":{"$ref":"#/components/schemas/AgreementSummary"},"type":"array","title":"Agreements"}},"type":"object","required":["agreements"],"title":"AgreementsList"},"AllCompetitorsMetaAdsResponse":{"properties":{"competitors":{"additionalProperties":{"$ref":"#/components/schemas/CompetitorMetaAdsResponse"},"type":"object","title":"Competitors"},"total_competitors":{"type":"integer","title":"Total Competitors"},"total_ads":{"type":"integer","title":"Total Ads"}},"type":"object","required":["competitors","total_competitors","total_ads"],"title":"AllCompetitorsMetaAdsResponse","description":"Response for all competitors Meta ads."},"AllPersonalizedResponse":{"properties":{"characters":{"items":{"$ref":"#/components/schemas/CharacterSchema"},"type":"array","title":"Characters"},"characters_source":{"type":"string","title":"Characters Source"},"styles":{"items":{"$ref":"#/components/schemas/StyleSchema"},"type":"array","title":"Styles"},"styles_source":{"type":"string","title":"Styles Source"},"sector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sector"},"memory":{"anyOf":[{"$ref":"#/components/schemas/ContextMemory"},{"type":"null"}]}},"type":"object","required":["characters","characters_source","styles","styles_source"],"title":"AllPersonalizedResponse","description":"Response containing both personalized characters and styles."},"AnalyticsOverview":{"properties":{"total_generated":{"type":"integer","title":"Total Generated"},"auto_generated":{"type":"integer","title":"Auto Generated"},"chat_generated":{"type":"integer","title":"Chat Generated"},"total_downloaded":{"type":"integer","title":"Total Downloaded"},"auto_downloaded":{"type":"integer","title":"Auto Downloaded"},"chat_downloaded":{"type":"integer","title":"Chat Downloaded"},"succeeded":{"type":"integer","title":"Succeeded"},"failed":{"type":"integer","title":"Failed"},"avg_turn_time_seconds":{"type":"number","title":"Avg Turn Time Seconds"},"pro_signups":{"type":"integer","title":"Pro Signups"},"lite_signups":{"type":"integer","title":"Lite Signups"}},"type":"object","required":["total_generated","auto_generated","chat_generated","total_downloaded","auto_downloaded","chat_downloaded","succeeded","failed","avg_turn_time_seconds","pro_signups","lite_signups"],"title":"AnalyticsOverview"},"AnonymousPipelineStartRequest":{"properties":{"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website","description":"Company URL; triggers fast-crawl for brand assets"},"company_short_description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Company Short Description","description":"Text description of the company"},"company_name":{"type":"string","maxLength":255,"minLength":1,"title":"Company Name","description":"Company/brand name"},"num_campaigns":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Num Campaigns","description":"Number of campaigns to generate","default":5},"reference_images":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":10},{"type":"null"}],"title":"Reference Images","description":"Base64-encoded brand/reference images (max 10)"},"product_images":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":10},{"type":"null"}],"title":"Product Images","description":"Base64-encoded product images (max 10)"}},"type":"object","required":["company_name"],"title":"AnonymousPipelineStartRequest","description":"Request to start full anonymous ad generation pipeline."},"AnonymousPipelineStartResponse":{"properties":{"job_id":{"type":"string","title":"Job Id","description":"Unique job ID to poll for status"},"status":{"type":"string","title":"Status","description":"started or failed"},"message":{"type":"string","title":"Message","description":"Status message","default":""}},"type":"object","required":["job_id","status"],"title":"AnonymousPipelineStartResponse","description":"Response from starting anonymous pipeline."},"AnonymousPipelineStatusResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","title":"Status","description":"Profile status: pending, processing, brand_assets_verified, ad_campaign_created, failed"},"completed":{"type":"boolean","title":"Completed","description":"Whether the full pipeline is complete","default":false},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Error message if failed"},"profile":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Profile","description":"Full profile data when completed"}},"type":"object","required":["job_id","status"],"title":"AnonymousPipelineStatusResponse","description":"Response for anonymous pipeline status check."},"AppSumoLicenseResponse":{"properties":{"license_key":{"type":"string","title":"License Key"},"tier":{"type":"integer","title":"Tier"},"tier_name":{"type":"string","title":"Tier Name"},"status":{"type":"string","title":"Status"},"is_linked":{"type":"boolean","title":"Is Linked"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}},"type":"object","required":["license_key","tier","tier_name","status","is_linked"],"title":"AppSumoLicenseResponse","description":"License validation response."},"AppSumoMonthlyTopupResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"total_licenses":{"type":"integer","title":"Total Licenses"},"topped_up_count":{"type":"integer","title":"Topped Up Count"},"already_topped_up_count":{"type":"integer","title":"Already Topped Up Count"},"skipped_count":{"type":"integer","title":"Skipped Count"},"total_credits_distributed":{"type":"integer","title":"Total Credits Distributed"}},"type":"object","required":["success","message","total_licenses","topped_up_count","already_topped_up_count","skipped_count","total_credits_distributed"],"title":"AppSumoMonthlyTopupResponse","description":"Response model for AppSumo monthly top-up."},"AppSumoUserRow":{"properties":{"license_id":{"type":"integer","title":"License Id"},"license_key":{"type":"string","title":"License Key"},"tier_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier Name"},"status":{"type":"string","title":"Status"},"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"signup_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signup Country"},"license_created_at":{"type":"string","format":"date-time","title":"License Created At"},"user_created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"User Created At"}},"type":"object","required":["license_id","license_key","tier_name","status","user_id","email","full_name","company","signup_country","license_created_at","user_created_at"],"title":"AppSumoUserRow"},"AppSumoUsersResponse":{"properties":{"rows":{"items":{"$ref":"#/components/schemas/AppSumoUserRow"},"type":"array","title":"Rows"},"total_count":{"type":"integer","title":"Total Count"}},"type":"object","required":["rows","total_count"],"title":"AppSumoUsersResponse"},"AppSumoWebhookResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"event":{"type":"string","title":"Event"}},"type":"object","required":["event"],"title":"AppSumoWebhookResponse","description":"Response to AppSumo webhooks."},"AspectRatio":{"type":"string","enum":["square","portrait","landscape","1:1","2:3","3:2","3:4","4:3","4:5","5:4","9:16","16:9","21:9"],"title":"AspectRatio","description":"Supported aspect ratios for ad images."},"AsyncTaskResponse":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Celery task ID for polling"},"status":{"type":"string","title":"Status","description":"Task status","default":"pending"},"message":{"type":"string","title":"Message","default":"Competitor discovery started"},"poll_url":{"type":"string","title":"Poll Url","description":"URL to poll for results"}},"type":"object","required":["task_id","poll_url"],"title":"AsyncTaskResponse","description":"Response when async mode is enabled."},"AttributionChannelRow":{"properties":{"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Campaign"},"funnel_starts":{"type":"integer","title":"Funnel Starts","default":0},"signups":{"type":"integer","title":"Signups","default":0},"activations":{"type":"integer","title":"Activations","default":0},"images_generated":{"type":"integer","title":"Images Generated","default":0},"downloads":{"type":"integer","title":"Downloads","default":0},"paid":{"type":"integer","title":"Paid","default":0},"signup_rate":{"type":"number","title":"Signup Rate","default":0.0},"activation_rate":{"type":"number","title":"Activation Rate","default":0.0},"paid_rate":{"type":"number","title":"Paid Rate","default":0.0}},"type":"object","title":"AttributionChannelRow","description":"Per-channel attribution metrics for ROI analysis."},"AuthResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In"},"user":{"$ref":"#/components/schemas/UserRead"}},"type":"object","required":["access_token","expires_in","user"],"title":"AuthResponse"},"BackupDatabaseResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"task_id":{"type":"string","title":"Task Id","default":""}},"type":"object","required":["success","message"],"title":"BackupDatabaseResponse"},"BasicSuccessResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"BasicSuccessResponse"},"BatchEvaluateRequest":{"properties":{"image_urls":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Image Urls"}},"type":"object","required":["image_urls"],"title":"BatchEvaluateRequest","description":"Request schema for batch evaluation dispatch."},"BatchEvaluateResponse":{"properties":{"batch_id":{"type":"string","title":"Batch Id"},"scores":{"additionalProperties":{"$ref":"#/components/schemas/ImageJudgeResponse"},"type":"object","title":"Scores","description":"Scores already cached at time of request"},"pending_urls":{"items":{"type":"string"},"type":"array","title":"Pending Urls","description":"URLs dispatched to Celery workers for evaluation"},"status":{"type":"string","title":"Status","description":"'completed' if all cached, otherwise 'processing'"},"poll_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Poll Url","description":"URL to poll for batch status (when status is 'processing')"}},"type":"object","required":["batch_id","status"],"title":"BatchEvaluateResponse","description":"Response schema for batch evaluation dispatch (202 Accepted)."},"BatchProductImageUploadRequest":{"properties":{"products":{"items":{"$ref":"#/components/schemas/SingleProductImageUpload"},"type":"array","maxItems":10,"minItems":1,"title":"Products","description":"List of products to upload (max 10)"}},"type":"object","required":["products"],"title":"BatchProductImageUploadRequest","description":"Request schema for batch uploading product images (one collection per image)."},"BatchProductImageUploadResponse":{"properties":{"group_id":{"type":"integer","title":"Group Id","description":"ID of the collection group"},"group_name":{"type":"string","title":"Group Name","description":"Name of the collection group"},"saphire_website_id":{"type":"integer","title":"Saphire Website Id","description":"Saphire website ID"},"total_requested":{"type":"integer","title":"Total Requested","description":"Total products in request"},"total_created":{"type":"integer","title":"Total Created","description":"Number of products successfully created"},"total_failed":{"type":"integer","title":"Total Failed","description":"Number of products that failed"},"products":{"items":{"$ref":"#/components/schemas/SingleProductUploadResult"},"type":"array","title":"Products","description":"Results for each product"}},"type":"object","required":["group_id","group_name","saphire_website_id","total_requested","total_created","total_failed"],"title":"BatchProductImageUploadResponse","description":"Response schema for batch product image upload."},"BatchScoresRequest":{"properties":{"image_urls":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Image Urls"}},"type":"object","required":["image_urls"],"title":"BatchScoresRequest","description":"Request schema for batch score lookup."},"BatchScoresResponse":{"properties":{"scores":{"additionalProperties":{"$ref":"#/components/schemas/ImageJudgeResponse"},"type":"object","title":"Scores"}},"type":"object","required":["scores"],"title":"BatchScoresResponse","description":"Response schema for batch score lookup. Only returns cached scores."},"BatchStatusResponse":{"properties":{"batch_id":{"type":"string","title":"Batch Id"},"status":{"type":"string","title":"Status","description":"'processing' or 'completed'"},"failed_urls":{"additionalProperties":{"type":"string"},"type":"object","title":"Failed Urls","description":"URLs whose evaluation failed for good (url -> error message); they are no longer pending"},"scores":{"additionalProperties":{"$ref":"#/components/schemas/ImageJudgeResponse"},"type":"object","title":"Scores","description":"Scores available so far"},"pending_urls":{"items":{"type":"string"},"type":"array","title":"Pending Urls","description":"URLs still awaiting evaluation"}},"type":"object","required":["batch_id","status"],"title":"BatchStatusResponse","description":"Response schema for polling batch evaluation status."},"BillingPortalSessionRequest":{"properties":{"return_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Return Url"}},"type":"object","title":"BillingPortalSessionRequest","description":"Request body for creating a Stripe billing portal session."},"BillingPortalSessionResponse":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"BillingPortalSessionResponse","description":"Response from creating a Stripe billing portal session."},"Body_agent_upload_api_v1_content_agent_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["file","session_id"],"title":"Body_agent_upload_api_v1_content_agent_upload_post"},"Body_agent_upload_image_api_v1_content_agent_upload_image_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["file","session_id"],"title":"Body_agent_upload_image_api_v1_content_agent_upload_image_post"},"Body_crawl_collection_group_api_v1_collections_groups__group_id__crawl_post":{"properties":{"include_paths":{"items":{"type":"string"},"type":"array","title":"Include Paths"},"exclude_paths":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Exclude Paths"}},"type":"object","required":["include_paths"],"title":"Body_crawl_collection_group_api_v1_collections_groups__group_id__crawl_post"},"Body_submit_onboarding_api_v1_enterprise_agreements_onboarding_post":{"properties":{"payload":{"type":"string","title":"Payload"},"invite_token":{"type":"string","title":"Invite Token"},"logo":{"type":"string","contentMediaType":"application/octet-stream","title":"Logo"}},"type":"object","required":["payload","invite_token","logo"],"title":"Body_submit_onboarding_api_v1_enterprise_agreements_onboarding_post"},"Body_upload_seed_design_api_v1_seed_designs_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"name":{"type":"string","title":"Name"},"source":{"type":"string","title":"Source","default":"manual"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"metadata_json":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metadata Json"}},"type":"object","required":["file","name"],"title":"Body_upload_seed_design_api_v1_seed_designs_upload_post"},"BrandAssetsResponse":{"properties":{"colors":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Colors"},"fonts":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Fonts"},"personality":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Personality"}},"type":"object","title":"BrandAssetsResponse"},"BrandColorsUpdateRequest":{"properties":{"colors":{"items":{},"type":"array","title":"Colors"}},"type":"object","required":["colors"],"title":"BrandColorsUpdateRequest"},"BrandContext":{"properties":{"brand_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Name"},"brand_colors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Brand Colors"},"style_guidelines":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Style Guidelines"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"}},"type":"object","title":"BrandContext","description":"Optional brand context for evaluation."},"BrandProfileResponse":{"properties":{"status":{"type":"string","title":"Status"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry"},"brand_assets":{"anyOf":[{"$ref":"#/components/schemas/BrandAssetsResponse"},{"type":"null"}]}},"type":"object","required":["status"],"title":"BrandProfileResponse"},"BusinessDescriptionOption":{"properties":{"sells":{"type":"string","title":"Sells"},"customers":{"type":"string","title":"Customers"}},"type":"object","required":["sells","customers"],"title":"BusinessDescriptionOption"},"ChangeUserPasswordRequest":{"properties":{"email":{"type":"string","title":"Email","description":"User email address"},"new_password":{"type":"string","minLength":6,"title":"New Password","description":"New password (min 6 characters)"}},"type":"object","required":["email","new_password"],"title":"ChangeUserPasswordRequest","description":"Request model for changing user password."},"ChangeUserPasswordResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"user_id":{"type":"integer","title":"User Id"},"user_email":{"type":"string","title":"User Email"}},"type":"object","required":["status","message","user_id","user_email"],"title":"ChangeUserPasswordResponse","description":"Response model for password change."},"CharacterSchema":{"properties":{"id":{"type":"string","title":"Id","description":"Unique identifier (e.g., 'professional-woman' or 'P000215')"},"name":{"type":"string","title":"Name","description":"Display name (e.g., 'Business Professional')"},"description":{"type":"string","title":"Description","description":"Short description of the persona"},"promptAddition":{"type":"string","title":"Promptaddition","description":"Personalized prompt text for image generation"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"age":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age"},"sex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sex"},"ethnicity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ethnicity"},"persona_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Persona Id"},"character_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Character Type"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"brand_objective":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Objective"},"creative_strategy":{"anyOf":[{"$ref":"#/components/schemas/CreativeStrategySchema"},{"type":"null"}]},"visual_direction":{"anyOf":[{"$ref":"#/components/schemas/VisualDirectionSchema"},{"type":"null"}]},"ad_story_beats":{"anyOf":[{"items":{"$ref":"#/components/schemas/AdStoryBeatSchema"},"type":"array"},{"type":"null"}],"title":"Ad Story Beats"}},"type":"object","required":["id","name","description","promptAddition"],"title":"CharacterSchema","description":"A character persona for ad imagery."},"CharactersResponse":{"properties":{"characters":{"items":{"$ref":"#/components/schemas/CharacterSchema"},"type":"array","title":"Characters"},"source":{"type":"string","title":"Source","description":"Source of personalization: 'product_understanding', 'company_description', or 'generic'"},"memory":{"anyOf":[{"$ref":"#/components/schemas/ContextMemory"},{"type":"null"}]}},"type":"object","required":["characters","source"],"title":"CharactersResponse","description":"Response containing personalized characters."},"ChatRequest":{"properties":{"message":{"type":"string","title":"Message","description":"User's message to the agent. Can be empty when chips provide the creative direction.","default":""},"session_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Session Id","description":"Existing session ID to continue conversation"},"ad_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ad Id","description":"AdCampaignAd ID - loads target_audience, product_info, brand_guidelines, intro_text, reference_images, and saphire_website_id automatically from database"},"manual_reference_generation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Manual Reference Generation Id","description":"ManualReferenceGeneration ID - loads the generated image into workspace for editing. Mutually exclusive with ad_id."},"context":{"anyOf":[{"$ref":"#/components/schemas/AgentContextInput"},{"type":"null"}],"description":"Manual context override (only used if ad_id/manual_reference_generation_id not provided)"},"saphire_website_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Saphire Website Id","description":"Saphire website ID for image generation (only used if ad_id/manual_reference_generation_id not provided)"},"inline_reference_images":{"anyOf":[{"items":{"$ref":"#/components/schemas/InlineReferenceImage"},"type":"array","maxItems":15},{"type":"null"}],"title":"Inline Reference Images","description":"Base64-encoded reference images to upload inline. Uploaded to S3 and merged into context.reference_images."}},"type":"object","title":"ChatRequest","description":"Request schema for sending a message to the image agent."},"ChatResponse":{"properties":{"session_id":{"type":"integer","title":"Session Id","description":"Session ID"},"text":{"type":"string","title":"Text","description":"Agent's text response"},"images":{"items":{"$ref":"#/components/schemas/ImageOutput"},"type":"array","title":"Images","description":"Images generated/modified in this response"},"workspace":{"$ref":"#/components/schemas/WorkspaceOutput","description":"Current workspace state"},"tool_calls_made":{"items":{"type":"string"},"type":"array","title":"Tool Calls Made","description":"Names of tools invoked in this response"},"frontend_context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Frontend Context","description":"Frontend session context persisted in backend"},"chat_request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat Request Id","description":"Unique ID grouping all LLM calls from this chat request"}},"type":"object","required":["session_id","text","workspace"],"title":"ChatResponse","description":"Response schema for agent chat interaction."},"CheckoutSessionRequest":{"properties":{"package_id":{"type":"string","title":"Package Id"},"success_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Success Url"},"cancel_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancel Url"}},"type":"object","required":["package_id"],"title":"CheckoutSessionRequest","description":"Request body for creating checkout session."},"CheckoutSessionResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"url":{"type":"string","title":"Url"}},"type":"object","required":["session_id","url"],"title":"CheckoutSessionResponse","description":"Response from creating checkout session."},"ClaimRequest":{"properties":{"claim_type":{"type":"string","title":"Claim Type"},"metadata":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metadata"}},"type":"object","required":["claim_type"],"title":"ClaimRequest","description":"Request body for claiming a credit reward."},"ClaimResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"credits_awarded":{"type":"integer","title":"Credits Awarded"},"new_balance":{"type":"integer","title":"New Balance"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","credits_awarded","new_balance","message"],"title":"ClaimResponse","description":"Response after claiming a credit reward."},"ClaimedRewardsResponse":{"properties":{"claimed_types":{"items":{"type":"string"},"type":"array","title":"Claimed Types"},"available_rewards":{"additionalProperties":true,"type":"object","title":"Available Rewards"}},"type":"object","required":["claimed_types","available_rewards"],"title":"ClaimedRewardsResponse","description":"Response with list of already-claimed reward types."},"CohortRetentionResponse":{"properties":{"cohorts":{"items":{"$ref":"#/components/schemas/CohortRetentionRow"},"type":"array","title":"Cohorts"},"max_weeks":{"type":"integer","title":"Max Weeks"}},"type":"object","required":["cohorts","max_weeks"],"title":"CohortRetentionResponse"},"CohortRetentionRow":{"properties":{"cohort_week":{"type":"string","title":"Cohort Week"},"cohort_size":{"type":"integer","title":"Cohort Size"},"retention":{"items":{"$ref":"#/components/schemas/CohortRetentionWeek"},"type":"array","title":"Retention"}},"type":"object","required":["cohort_week","cohort_size","retention"],"title":"CohortRetentionRow"},"CohortRetentionWeek":{"properties":{"week_number":{"type":"integer","title":"Week Number"},"active_users":{"type":"integer","title":"Active Users"},"retention_pct":{"type":"number","title":"Retention Pct"}},"type":"object","required":["week_number","active_users","retention_pct"],"title":"CohortRetentionWeek"},"CohortUserRow":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","email","created_at"],"title":"CohortUserRow"},"CohortUsersResponse":{"properties":{"rows":{"items":{"$ref":"#/components/schemas/CohortUserRow"},"type":"array","title":"Rows"},"total_count":{"type":"integer","title":"Total Count"}},"type":"object","required":["rows","total_count"],"title":"CohortUsersResponse"},"CollectionDetailSchema":{"properties":{"id":{"type":"integer","title":"Id"},"group_id":{"type":"integer","title":"Group Id"},"website_id":{"type":"integer","title":"Website Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"group_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Name"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"scrape_status":{"type":"string","title":"Scrape Status"},"scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scraped At"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"image_count":{"type":"integer","title":"Image Count","default":0},"source_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Type"},"editable":{"type":"boolean","title":"Editable","default":true},"can_delete":{"type":"boolean","title":"Can Delete","default":true},"can_rename":{"type":"boolean","title":"Can Rename","default":true},"has_images":{"type":"boolean","title":"Has Images","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"images":{"items":{"$ref":"#/components/schemas/CollectionImageSchema"},"type":"array","title":"Images"}},"type":"object","required":["id","group_id","website_id","name","slug","scrape_status","created_at"],"title":"CollectionDetailSchema","description":"Collection with images included."},"CollectionGroupDetailSchema":{"properties":{"id":{"type":"integer","title":"Id"},"website_id":{"type":"integer","title":"Website Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"url_pattern":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url Pattern"},"display_order":{"type":"integer","title":"Display Order"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"collections":{"items":{"$ref":"#/components/schemas/CollectionSchema"},"type":"array","title":"Collections"},"collection_count":{"type":"integer","title":"Collection Count","default":0}},"type":"object","required":["id","website_id","name","slug","display_order","created_at","updated_at"],"title":"CollectionGroupDetailSchema","description":"Collection group with collections included."},"CollectionImageSchema":{"properties":{"id":{"type":"integer","title":"Id"},"collection_id":{"type":"integer","title":"Collection Id"},"image_url":{"type":"string","title":"Image Url"},"s3_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S3 Url"},"alt_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alt Text"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"},"file_extension":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Extension"},"display_order":{"type":"integer","title":"Display Order"},"is_primary":{"type":"boolean","title":"Is Primary"},"relevance_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Relevance Score"}},"type":"object","required":["id","collection_id","image_url","display_order","is_primary"],"title":"CollectionImageSchema","description":"Image from a collection."},"CollectionSchema":{"properties":{"id":{"type":"integer","title":"Id"},"group_id":{"type":"integer","title":"Group Id"},"website_id":{"type":"integer","title":"Website Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"group_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group Name"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"scrape_status":{"type":"string","title":"Scrape Status"},"scraped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scraped At"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"image_count":{"type":"integer","title":"Image Count","default":0},"source_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Type"},"editable":{"type":"boolean","title":"Editable","default":true},"can_delete":{"type":"boolean","title":"Can Delete","default":true},"can_rename":{"type":"boolean","title":"Can Rename","default":true},"has_images":{"type":"boolean","title":"Has Images","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","group_id","website_id","name","slug","scrape_status","created_at"],"title":"CollectionSchema","description":"A collection of images from a single page/product."},"CollectionsStatusResponse":{"properties":{"is_crawling":{"type":"boolean","title":"Is Crawling"},"done_count":{"type":"integer","title":"Done Count"},"pending_count":{"type":"integer","title":"Pending Count"},"total_count":{"type":"integer","title":"Total Count"},"uploaded_count":{"type":"integer","title":"Uploaded Count","default":0},"imported_count":{"type":"integer","title":"Imported Count","default":0},"has_uploaded_products":{"type":"boolean","title":"Has Uploaded Products","default":false},"has_imported_products":{"type":"boolean","title":"Has Imported Products","default":false},"state":{"type":"string","title":"State","default":"never_started"},"empty_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Empty State"},"can_upload":{"type":"boolean","title":"Can Upload","default":true},"can_import_website":{"type":"boolean","title":"Can Import Website","default":true},"import_unavailable_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Import Unavailable Reason"},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error"},"last_started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Started At"},"last_completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Completed At"}},"type":"object","required":["is_crawling","done_count","pending_count","total_count"],"title":"CollectionsStatusResponse","description":"Status response for the current user's collections."},"CombinedCompanyProfileResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"was_existing":{"type":"boolean","title":"Was Existing","default":false},"company_profile":{"anyOf":[{"$ref":"#/components/schemas/CompanyProfileDetail"},{"type":"null"}]},"company_profile_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Profile Error"},"saphire_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Saphire Error"},"image_stats":{"anyOf":[{"$ref":"#/components/schemas/ImageGenerationStats"},{"type":"null"}]},"forecast_stats":{"anyOf":[{"$ref":"#/components/schemas/ForecastGenerationStats"},{"type":"null"}]},"forecast_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Forecast Error"}},"type":"object","required":["success"],"title":"CombinedCompanyProfileResponse","description":"Combined response with company profile (includes company research and campaigns)."},"CompanyContractRequest":{"properties":{"values":{"$ref":"#/components/schemas/Values"}},"type":"object","required":["values"],"title":"CompanyContractRequest"},"CompanyFactItem":{"properties":{"type":{"type":"string","title":"Type"},"value":{"type":"string","title":"Value"}},"type":"object","required":["type","value"],"title":"CompanyFactItem","description":"A company fact entry."},"CompanyProfileDetail":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"status":{"type":"string","title":"Status"},"client_website":{"type":"string","title":"Client Website"},"model_used":{"type":"string","title":"Model Used"},"product_or_offering_understanding":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Or Offering Understanding"},"target_audience_descriptions":{"anyOf":[{"items":{"$ref":"#/components/schemas/TargetAudienceSegmentResponse"},"type":"array"},{"type":"null"}],"title":"Target Audience Descriptions"},"linkedin_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Url"},"twitter_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Twitter Url"},"instagram_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instagram Url"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry"},"founding_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Founding Year"},"headquarters":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headquarters"},"prompt_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prompt Tokens"},"completion_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Completion Tokens"},"total_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Tokens"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"saphire_website_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Saphire Website Id"},"saphire_website":{"anyOf":[{"$ref":"#/components/schemas/SaphireWebsiteSummary"},{"type":"null"}]},"campaigns":{"items":{"$ref":"#/components/schemas/AdCampaignResponse"},"type":"array","title":"Campaigns"}},"type":"object","required":["id","user_id","status","client_website","model_used","created_at"],"title":"CompanyProfileDetail","description":"Full detail of a company profile including campaigns and ads."},"CompetitorDiscoverRequest":{"properties":{"website_url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Website Url","description":"Company website to analyze","examples":["https://example.com"]},"async_mode":{"type":"boolean","title":"Async Mode","description":"If true, runs in background and returns task_id for polling","default":true}},"type":"object","required":["website_url"],"title":"CompetitorDiscoverRequest","description":"Request for competitor discovery."},"CompetitorDiscoverResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Task status","default":"completed"},"company_name":{"type":"string","title":"Company Name","description":"Identified company name"},"company_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Description","description":"What the company does"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry","description":"Industry classification"},"sub_vertical":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sub Vertical","description":"Specific sub-vertical"},"competitors":{"items":{"$ref":"#/components/schemas/DiscoveredCompetitor"},"type":"array","title":"Competitors","description":"List of direct competitors"},"elapsed_seconds":{"type":"number","title":"Elapsed Seconds","description":"Time taken for discovery"},"raw_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Raw Id","description":"PrimaryCompetitorRaw ID"}},"type":"object","required":["company_name","competitors","elapsed_seconds"],"title":"CompetitorDiscoverResponse","description":"Response from competitor discovery."},"CompetitorMetaAdsResponse":{"properties":{"competitor_name":{"type":"string","title":"Competitor Name"},"total_ads":{"type":"integer","title":"Total Ads"},"ads":{"items":{"$ref":"#/components/schemas/MetaAdResponse"},"type":"array","title":"Ads"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["competitor_name","total_ads","ads"],"title":"CompetitorMetaAdsResponse","description":"Response for competitor Meta ads."},"CompleteRegistrationRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"code":{"type":"string","maxLength":6,"minLength":6,"pattern":"^\\d{6}$","title":"Code"},"password":{"type":"string","minLength":6,"title":"Password"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"company_short_desc":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Company Short Desc"},"ad_primary_language":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Ad Primary Language","description":"Primary language for ad generation"},"is_pro":{"type":"boolean","title":"Is Pro","description":"True = pro user (full Saphire flow), False = lite user (Lite Studio only)","default":true},"saphire_website_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Saphire Website Id","description":"Saphire website ID from empty-website creation (for lite users)"},"appsumo_license_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appsumo License Key","description":"AppSumo license key for lifetime deal users"},"invite_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invite Token","description":"Team invite token — auto-accepts the invite after registration"},"instagram_username":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Instagram Username","description":"Instagram username for IG signup users"},"friendvibes_session_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Friendvibes Session Id","description":"Friendvibes session ID to link after registration (for lite users)"},"friendvibes_selected_company_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Friendvibes Selected Company Id","description":"Which friendvibes company the user selected as style inspiration"},"utm_source":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Utm Source","description":"UTM source (e.g. google, meta)"},"utm_medium":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Utm Medium","description":"UTM medium (e.g. cpc, social)"},"utm_campaign":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Utm Campaign","description":"UTM campaign name"},"utm_term":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Utm Term","description":"UTM term (paid search keyword)"},"utm_content":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Utm Content","description":"UTM content (ad variation)"},"gad_source":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Gad Source","description":"Google Ads click source"},"referrer":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Referrer","description":"document.referrer hostname"},"cta":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Cta","description":"CTA button identifier"}},"type":"object","required":["email","code","password"],"title":"CompleteRegistrationRequest","description":"Request to complete registration after email/phone verification."},"CompleteRegistrationResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In"},"user":{"$ref":"#/components/schemas/UserRead"}},"type":"object","required":["access_token","expires_in","user"],"title":"CompleteRegistrationResponse","description":"Response after completing registration."},"ContentItemResponse":{"properties":{"id":{"type":"integer","title":"Id"},"calendar_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Calendar Id"},"content_type":{"type":"string","title":"Content Type"},"platform":{"type":"string","title":"Platform"},"scheduled_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled Date"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"creative_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creative Prompt"},"ad_copy":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ad Copy"},"dimensions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dimensions"},"budget":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Budget"},"duration_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Days"},"target_audience":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Target Audience"},"campaign_objective":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign Objective"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"status":{"type":"string","title":"Status"}},"type":"object","required":["id","content_type","platform","status"],"title":"ContentItemResponse"},"ContentItemUpdate":{"properties":{"scheduled_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled Date"},"theme":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Theme"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"dimensions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dimensions"},"creative_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creative Prompt"},"ad_copy":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Ad Copy"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"budget":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Budget"},"target_audience":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Target Audience"},"campaign_objective":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign Objective"}},"type":"object","title":"ContentItemUpdate"},"ContextMemory":{"properties":{"product_understanding":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Understanding"},"company_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Description"},"company_facts":{"anyOf":[{"items":{"$ref":"#/components/schemas/CompanyFactItem"},"type":"array"},{"type":"null"}],"title":"Company Facts"}},"type":"object","title":"ContextMemory","description":"Context data used for personalization."},"CountersignRequest":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"email":{"type":"string","maxLength":254,"minLength":1,"title":"Email"},"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title"},"signature":{"$ref":"#/components/schemas/Signature"}},"type":"object","required":["name","email","title","signature"],"title":"CountersignRequest"},"CrawlCollectionGroupResponse":{"properties":{"group_id":{"type":"integer","title":"Group Id"},"pages_crawled":{"type":"integer","title":"Pages Crawled"},"collections_created":{"type":"integer","title":"Collections Created","default":0},"collections_updated":{"type":"integer","title":"Collections Updated"},"total_images":{"type":"integer","title":"Total Images"},"urls_discovered":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Urls Discovered"},"urls_fetched":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Urls Fetched"},"collections_changed":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Collections Changed"},"collections_unchanged":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Collections Unchanged"},"inactive_urls":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Inactive Urls"}},"type":"object","required":["group_id","pages_crawled","collections_updated","total_images"],"title":"CrawlCollectionGroupResponse","description":"Response from crawling a collection group."},"CreateCalendarRequest":{"properties":{"name":{"type":"string","title":"Name"},"start_date":{"type":"string","title":"Start Date"},"end_date":{"type":"string","title":"End Date"},"items":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Items"},"batch_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Batch Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},"type":"object","required":["name","start_date","end_date"],"title":"CreateCalendarRequest"},"CreateSessionRequest":{"properties":{"ad_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ad Id","description":"AdCampaignAd ID - loads target_audience, product_info, brand_guidelines, intro_text, reference_images, and saphire_website_id automatically from database"},"manual_reference_generation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Manual Reference Generation Id","description":"ManualReferenceGeneration ID - loads the generated image into workspace for editing. Mutually exclusive with ad_id."},"context":{"anyOf":[{"$ref":"#/components/schemas/AgentContextInput"},{"type":"null"}],"description":"Manual context override (only used if ad_id/manual_reference_generation_id not provided)"},"saphire_website_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Saphire Website Id","description":"Saphire website ID for image generation (only used if ad_id/manual_reference_generation_id not provided)"},"use_manual_references":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Use Manual References","description":"Whether to use manual reference uploads for image generation"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"External image URL to initialize workspace with. Used for editing Meta ads or other external images."},"meta_ad_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta Ad Id","description":"Meta Ad Library ad ID (ad_archive_id). When provided with image_url, creates a proper AdCampaignAd linked to the user's Meta ad."}},"type":"object","title":"CreateSessionRequest","description":"Request schema for creating a new agent session."},"CreateTargetAudienceRequest":{"properties":{"target_audience_summary":{"type":"string","maxLength":255,"title":"Target Audience Summary","description":"Short 2-4 word name (e.g., 'Startup CTOs')"},"target_audience_description":{"type":"string","maxLength":5000,"title":"Target Audience Description","description":"Detailed audience description"},"estimated_audience_size":{"anyOf":[{"type":"string","enum":["small","medium","large"]},{"type":"null"}],"title":"Estimated Audience Size"},"purchase_probability":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Purchase Probability"}},"type":"object","required":["target_audience_summary","target_audience_description"],"title":"CreateTargetAudienceRequest"},"CreateTeamRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"CreateTeamRequest"},"CreativeStrategySchema":{"properties":{"hook_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hook Style"},"value_prop_angle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value Prop Angle"},"proof_point":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Proof Point"}},"type":"object","title":"CreativeStrategySchema","description":"Creative strategy for a character persona."},"CreditBalanceResponse":{"properties":{"balance":{"type":"integer","title":"Balance"},"total_earned":{"type":"integer","title":"Total Earned"},"total_spent":{"type":"integer","title":"Total Spent"},"next_renewal_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Renewal Date"},"monthly_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Credits"}},"type":"object","required":["balance","total_earned","total_spent"],"title":"CreditBalanceResponse","description":"Current credit balance response."},"CreditTransactionHistoryResponse":{"properties":{"transactions":{"items":{"$ref":"#/components/schemas/CreditTransactionResponse"},"type":"array","title":"Transactions"},"total_count":{"type":"integer","title":"Total Count"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["transactions","total_count","limit","offset"],"title":"CreditTransactionHistoryResponse","description":"Transaction history response with pagination."},"CreditTransactionResponse":{"properties":{"id":{"type":"integer","title":"Id"},"transaction_type":{"type":"string","title":"Transaction Type"},"amount":{"type":"integer","title":"Amount"},"balance_after":{"type":"integer","title":"Balance After"},"tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","transaction_type","amount","balance_after","created_at"],"title":"CreditTransactionResponse","description":"Single transaction record."},"CriterionScore":{"properties":{"name":{"type":"string","title":"Name"},"score":{"type":"integer","maximum":5.0,"minimum":0.0,"title":"Score"},"reasoning":{"type":"string","title":"Reasoning"}},"type":"object","required":["name","score","reasoning"],"title":"CriterionScore","description":"Score for a single criterion on the 1-5 Likert scale."},"CustomCharacterRequest":{"properties":{"description":{"type":"string","maxLength":500,"minLength":10,"title":"Description","description":"Free-form character description"},"character_type":{"type":"string","title":"Character Type","description":"Character type: humans, 2d, or 3d","default":"humans"}},"type":"object","required":["description"],"title":"CustomCharacterRequest"},"DailyCountBucket":{"properties":{"date":{"type":"string","title":"Date"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["date","count"],"title":"DailyCountBucket"},"DailyPipelineResponse":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Celery task ID for polling"},"status":{"type":"string","title":"Status","description":"Task status","default":"pending"},"message":{"type":"string","title":"Message","default":"Pipeline started"}},"type":"object","required":["task_id"],"title":"DailyPipelineResponse"},"DevAgentSessionTrace":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"status":{"type":"string","title":"Status"},"ad_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ad Id"},"saphire_website_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Saphire Website Id"},"manual_reference_generation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Manual Reference Generation Id"},"context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Context","description":"JSONB: target_audience, product_info, brand_guidelines loaded for this session"},"workspace":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Workspace","description":"JSONB: all images in workspace, primary image pointer"},"reference_images":{"items":{"$ref":"#/components/schemas/DevReferenceImage"},"type":"array","title":"Reference Images"},"timeline":{"items":{"$ref":"#/components/schemas/DevTraceEvent"},"type":"array","title":"Timeline","description":"Chronologically sorted events: llm_call, tool_execution, user_message, assistant_message"},"stats":{"$ref":"#/components/schemas/DevTraceStats"},"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","status","created_at","updated_at"],"title":"DevAgentSessionTrace","description":"The comprehensive trace for an Image Agent session.\n\nContains the full timeline: every LLM call (with complete prompt),\nevery tool execution (with raw args/results), every message, all\nsorted chronologically so you can see the complete ReAct flow."},"DevAuthResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In"},"user":{"$ref":"#/components/schemas/DevUserResponse"}},"type":"object","required":["access_token","expires_in","user"],"title":"DevAuthResponse"},"DevLLMCallDetail":{"properties":{"id":{"type":"integer","title":"Id"},"caller":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caller","description":"Who made this call: image_agent.reasoning, creative_prompt.generate, etc."},"model":{"type":"string","title":"Model"},"system_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"System Prompt","description":"The full system prompt sent (includes brand context + workspace state)"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt","description":"The user message / prompt content"},"response_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Text","description":"The LLM's text response"},"success":{"type":"boolean","title":"Success","default":true},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"prompt_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Prompt Tokens"},"response_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Tokens"},"total_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Tokens"},"response_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Time Ms"},"session_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Session Id","description":"Which agent session this call belongs to"},"iteration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Iteration","description":"Which ReAct iteration (1-based)"},"conversation_length":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Conversation Length","description":"Number of messages in the conversation array sent to LLM"},"temperature":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Temperature"},"tool_calls_made":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Tool Calls Made","description":"Raw tool call decisions from LLM response [{id, name, arguments}]"},"available_tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Available Tools","description":"Tool names available to the LLM in this call"},"conversation_messages":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Conversation Messages","description":"The full conversation messages array sent to LLM"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","model","created_at"],"title":"DevLLMCallDetail","description":"Full detail for a single LLM API call — the exact prompt and response."},"DevLLMCallListResponse":{"properties":{"session_id":{"type":"integer","title":"Session Id"},"llm_calls":{"items":{"$ref":"#/components/schemas/DevLLMCallDetail"},"type":"array","title":"Llm Calls"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["session_id","llm_calls","total"],"title":"DevLLMCallListResponse"},"DevReferenceImage":{"properties":{"id":{"type":"integer","title":"Id"},"s3_url":{"type":"string","title":"S3 Url"},"is_logo":{"type":"boolean","title":"Is Logo"},"display_order":{"type":"integer","title":"Display Order"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","s3_url","is_logo","display_order","created_at"],"title":"DevReferenceImage"},"DevSearchResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/DevSearchResult"},"type":"array","title":"Results"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["results","total","limit","offset"],"title":"DevSearchResponse"},"DevSearchResult":{"properties":{"source":{"type":"string","title":"Source"},"kind":{"type":"string","enum":["user","conversation","image"],"title":"Kind"},"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"snippet":{"type":"string","title":"Snippet"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"detail_url":{"type":"string","title":"Detail Url"}},"type":"object","required":["source","kind","id","user_id","email","snippet","detail_url"],"title":"DevSearchResult"},"DevSessionListResponse":{"properties":{"sessions":{"items":{"$ref":"#/components/schemas/DevSessionSummary"},"type":"array","title":"Sessions"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["sessions","total"],"title":"DevSessionListResponse"},"DevSessionSummary":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"status":{"type":"string","title":"Status"},"message_count":{"type":"integer","title":"Message Count","default":0},"ad_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ad Id"},"saphire_website_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Saphire Website Id"},"tool_execution_count":{"type":"integer","title":"Tool Execution Count","default":0},"error_count":{"type":"integer","title":"Error Count","default":0},"preview_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Text"},"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","status","created_at","updated_at"],"title":"DevSessionSummary"},"DevToolExecutionDetail":{"properties":{"id":{"type":"integer","title":"Id"},"session_id":{"type":"integer","title":"Session Id"},"message_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Message Id"},"tool_name":{"type":"string","title":"Tool Name"},"tool_args":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tool Args","description":"Raw JSONB: what the LLM asked the tool to do"},"tool_result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Tool Result","description":"Raw JSONB: what the tool returned (success, images, data)"},"creative_prompt":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Creative Prompt","description":"The creative prompt dict sent to the image generation API"},"execution_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Execution Time Ms"},"status":{"type":"string","title":"Status"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"saphire_generation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Saphire Generation Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","session_id","tool_name","status","created_at"],"title":"DevToolExecutionDetail","description":"Full detail for a single tool execution — the raw args/results/prompt."},"DevToolExecutionListResponse":{"properties":{"session_id":{"type":"integer","title":"Session Id"},"executions":{"items":{"$ref":"#/components/schemas/DevToolExecutionDetail"},"type":"array","title":"Executions"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["session_id","executions","total"],"title":"DevToolExecutionListResponse"},"DevTraceEvent":{"properties":{"type":{"type":"string","title":"Type","description":"Event type: llm_call, tool_execution, user_message, assistant_message"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"data":{"additionalProperties":true,"type":"object","title":"Data","description":"Full event payload (varies by type)"}},"type":"object","required":["type","timestamp"],"title":"DevTraceEvent","description":"A single event in the session trace timeline."},"DevTraceStats":{"properties":{"total_llm_calls":{"type":"integer","title":"Total Llm Calls","default":0},"total_tool_executions":{"type":"integer","title":"Total Tool Executions","default":0},"total_errors":{"type":"integer","title":"Total Errors","default":0},"total_llm_tokens":{"type":"integer","title":"Total Llm Tokens","default":0},"total_execution_time_ms":{"type":"integer","title":"Total Execution Time Ms","default":0},"tools_used":{"items":{"type":"string"},"type":"array","title":"Tools Used"},"models_used":{"items":{"type":"string"},"type":"array","title":"Models Used"}},"type":"object","title":"DevTraceStats","description":"Aggregate stats for a session trace."},"DevUserCreateRequest":{"properties":{"username":{"type":"string","maxLength":255,"minLength":3,"title":"Username"},"email":{"type":"string","pattern":"^[^@]+@[^@]+\\.[^@]+$","title":"Email"},"password":{"type":"string","minLength":6,"title":"Password"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"}},"type":"object","required":["username","email","password"],"title":"DevUserCreateRequest"},"DevUserDetail":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"is_active":{"type":"boolean","title":"Is Active"},"is_pro":{"type":"boolean","title":"Is Pro"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"company_website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Website"},"company_short_desc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Short Desc"},"ad_primary_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ad Primary Language"},"user_type":{"type":"string","title":"User Type"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_login":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login"},"agent_session_count":{"type":"integer","title":"Agent Session Count","default":0},"last_agent_session_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Agent Session At"}},"type":"object","required":["id","email","is_active","is_pro","user_type","created_at"],"title":"DevUserDetail"},"DevUserLoginRequest":{"properties":{"email":{"type":"string","pattern":"^[^@]+@[^@]+\\.[^@]+$","title":"Email"},"password":{"type":"string","minLength":6,"title":"Password"}},"type":"object","required":["email","password"],"title":"DevUserLoginRequest"},"DevUserResponse":{"properties":{"id":{"type":"integer","title":"Id"},"username":{"type":"string","title":"Username"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"is_active":{"type":"boolean","title":"Is Active"},"can_llms":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Llms"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_login":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login"}},"type":"object","required":["id","username","email","is_active","created_at"],"title":"DevUserResponse"},"DevUserSearchResponse":{"properties":{"users":{"items":{"$ref":"#/components/schemas/DevUserSummary"},"type":"array","title":"Users"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["users","total"],"title":"DevUserSearchResponse"},"DevUserSummary":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"is_active":{"type":"boolean","title":"Is Active"},"is_pro":{"type":"boolean","title":"Is Pro"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","email","is_active","is_pro","created_at"],"title":"DevUserSummary"},"DiscoverImageItem":{"properties":{"key":{"type":"string","title":"Key"},"url":{"type":"string","title":"Url"},"ad_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ad Category"},"industry_vertical":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry Vertical"},"brand_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Name"},"product_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Name"},"visual_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Visual Style"},"quality_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quality Score"},"source_region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Region"},"source_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Type"}},"type":"object","required":["key","url"],"title":"DiscoverImageItem","description":"A single image in the discover feed."},"DiscoverPageResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/DiscoverImageItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"has_more":{"type":"boolean","title":"Has More"},"offset":{"type":"integer","title":"Offset"},"limit":{"type":"integer","title":"Limit"},"seed":{"type":"integer","title":"Seed"},"matched_vertical":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Matched Vertical"},"filtered_total":{"type":"integer","title":"Filtered Total","default":0}},"type":"object","required":["items","total","has_more","offset","limit","seed"],"title":"DiscoverPageResponse","description":"Paginated discover feed response."},"DiscoveredCompetitor":{"properties":{"name":{"type":"string","title":"Name","description":"Competitor company name"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website","description":"Competitor website URL"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Why they are a competitor"}},"type":"object","required":["name"],"title":"DiscoveredCompetitor","description":"Single competitor in the response."},"DiscoveryStatusResponse":{"properties":{"has_competitors":{"type":"boolean","title":"Has Competitors","description":"Whether user has GPT-5 discovered competitors"},"competitor_count":{"type":"integer","title":"Competitor Count","description":"Number of competitors discovered"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name","description":"Company name from discovery"},"industry":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Industry","description":"Industry classification"},"sub_vertical":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sub Vertical","description":"Specific sub-vertical"},"discovered_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Discovered At","description":"When competitors were discovered"}},"type":"object","required":["has_competitors","competitor_count"],"title":"DiscoveryStatusResponse","description":"Response for user's competitor discovery status."},"DistinctValues":{"properties":{"event_types":{"items":{"type":"string"},"type":"array","title":"Event Types"},"event_sources":{"items":{"type":"string"},"type":"array","title":"Event Sources"}},"type":"object","required":["event_types","event_sources"],"title":"DistinctValues"},"DownloadAccessRequest":{"properties":{"ad_image_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ad Image Id","description":"Owned AdImage ID to authorize download access against"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"Owned source image URL to authorize download access against"}},"type":"object","title":"DownloadAccessRequest","description":"Request to authorize a downloadable image."},"DownloadAccessResponse":{"properties":{"allowed":{"type":"boolean","title":"Allowed","default":true},"is_subscribed":{"type":"boolean","title":"Is Subscribed","description":"Whether the authenticated user has unlimited download access"},"free_downloads_remaining":{"type":"integer","title":"Free Downloads Remaining","description":"How many unsubscribed downloads remain after this authorization"},"consumed_free_download":{"type":"boolean","title":"Consumed Free Download","description":"Whether this request consumed one of the user's free downloads","default":false}},"type":"object","required":["is_subscribed","free_downloads_remaining"],"title":"DownloadAccessResponse","description":"Response from the download access authorization endpoint."},"DownloadGateCountrySummary":{"properties":{"country":{"type":"string","title":"Country"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["country","count"],"title":"DownloadGateCountrySummary"},"DownloadGateEvent":{"properties":{"user_id":{"type":"integer","title":"User Id"},"email":{"type":"string","title":"Email"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"signup_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signup Country"},"page_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Source"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["user_id","email","company","signup_country","page_source","created_at"],"title":"DownloadGateEvent"},"DownloadUsageFeedbackCreate":{"properties":{"usage_type":{"type":"string","title":"Usage Type"},"selected_platforms":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Selected Platforms"},"custom_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Text"},"page_source":{"type":"string","title":"Page Source"}},"type":"object","required":["usage_type","page_source"],"title":"DownloadUsageFeedbackCreate","description":"Request body for submitting download usage feedback."},"DownloadUsageFeedbackResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"credits_awarded":{"type":"integer","title":"Credits Awarded"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","credits_awarded","message"],"title":"DownloadUsageFeedbackResponse","description":"Response after submitting download usage feedback."},"DownloadedImageRecord":{"properties":{"user_id":{"type":"integer","title":"User Id"},"email":{"type":"string","title":"Email"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"is_pro":{"type":"boolean","title":"Is Pro"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"source":{"type":"string","title":"Source"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"generation_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Generation Time Ms"},"aspect_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect Ratio"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["user_id","email","company","is_pro","image_url","source","session_id","prompt","aspect_ratio","created_at"],"title":"DownloadedImageRecord"},"EarlyAccessFeature":{"type":"string","enum":["linkedin_deploy","meta_ads","google_ads"],"title":"EarlyAccessFeature","description":"Valid early access features."},"EarlyAccessRequest":{"properties":{"feature":{"$ref":"#/components/schemas/EarlyAccessFeature","description":"Feature to sign up for early access: linkedin_deploy, meta_ads, or google_ads"}},"type":"object","required":["feature"],"title":"EarlyAccessRequest","description":"Request model for early access signup notifications."},"EarlyAccessStatusResponse":{"properties":{"linkedin_deploy":{"type":"boolean","title":"Linkedin Deploy","description":"Whether user signed up for LinkedIn Direct Deploy"},"meta_ads":{"type":"boolean","title":"Meta Ads","description":"Whether user signed up for Meta Ads Campaign Manager"},"google_ads":{"type":"boolean","title":"Google Ads","description":"Whether user signed up for Google Ads Campaign Manager"}},"type":"object","required":["linkedin_deploy","meta_ads","google_ads"],"title":"EarlyAccessStatusResponse","description":"Response model for early access status check."},"EmailCTAClickRequest":{"properties":{"email_type":{"type":"string","title":"Email Type","description":"Email type: welcome, one_week_checkin, low_credits, out_of_credits"},"cta_type":{"type":"string","title":"Cta Type","description":"CTA type: login, dashboard, buy_credits, campaign_studio"}},"type":"object","required":["email_type","cta_type"],"title":"EmailCTAClickRequest","description":"Request model for email CTA click notifications."},"EmptyWebsiteResponse":{"properties":{"website_id":{"type":"integer","title":"Website Id","description":"Saphire website ID"},"url":{"type":"string","title":"Url","description":"Placeholder URL"},"is_empty":{"type":"boolean","title":"Is Empty","description":"Always true for empty websites","default":true},"message":{"type":"string","title":"Message","description":"Status message"}},"type":"object","required":["website_id","url","message"],"title":"EmptyWebsiteResponse","description":"Response from creating an empty website for lite users."},"EnhanceForPrintRequest":{"properties":{"ad_image_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ad Image Id","description":"ID of the source AdImage to enhance for print (use this OR image_url)"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"Direct URL of the image to enhance (use this OR ad_image_id)"},"print_format":{"$ref":"#/components/schemas/PrintFormat","description":"Target print format (A3/A4 portrait/landscape)"},"output_format":{"$ref":"#/components/schemas/OutputFormat","description":"Output file format (pdf, jpeg, png)","default":"jpeg"}},"type":"object","required":["print_format"],"title":"EnhanceForPrintRequest","description":"Request to enhance an ad image for A3/A4 print export."},"EnhanceForPrintResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"source_image":{"$ref":"#/components/schemas/AdImageResponse","description":"The original source image"},"enhanced_image_url":{"type":"string","title":"Enhanced Image Url","description":"S3 URL of the enhanced print-ready image"},"output_format":{"type":"string","title":"Output Format","description":"The output format (pdf, jpeg, png)"},"print_format":{"type":"string","title":"Print Format","description":"The print format used (a3_portrait, etc.)"},"print_metadata":{"$ref":"#/components/schemas/PrintMetadata","description":"Metadata about the print export"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","source_image","enhanced_image_url","output_format","print_format","print_metadata","message"],"title":"EnhanceForPrintResponse","description":"Response from print enhancement operation."},"EventBySource":{"properties":{"event_source":{"type":"string","title":"Event Source"},"event_type":{"type":"string","title":"Event Type"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["event_source","event_type","count"],"title":"EventBySource"},"EventFunnelStep":{"properties":{"event_type":{"type":"string","title":"Event Type"},"unique_users":{"type":"integer","title":"Unique Users"}},"type":"object","required":["event_type","unique_users"],"title":"EventFunnelStep"},"EventTimeSeriesBucket":{"properties":{"bucket":{"type":"string","title":"Bucket"},"event_type":{"type":"string","title":"Event Type"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["bucket","event_type","count"],"title":"EventTimeSeriesBucket"},"ExportRequest":{"properties":{"calendar_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Calendar Id"},"item_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Item Ids"}},"type":"object","title":"ExportRequest"},"ExtractProductUrlRequest":{"properties":{"url":{"type":"string","title":"Url","description":"Product page URL to scrape and extract data from"}},"type":"object","required":["url"],"title":"ExtractProductUrlRequest","description":"Request to extract product data from a URL."},"ExtractProductUrlResponse":{"properties":{"product_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Name","description":"Product title/name"},"price":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Price","description":"Displayed price string"},"price_numeric":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Numeric","description":"Numeric price value"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency","description":"3-letter currency code (USD, EUR, AUD, etc.)"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Product description (max 500 chars)"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"Main product image URL"},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls","description":"All product image URLs (max 10)"},"vendor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vendor","description":"Brand or manufacturer name"},"product_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Type","description":"Product category"},"in_stock":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"In Stock","description":"Whether the product is in stock"},"on_sale":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"On Sale","description":"Whether the product is on sale"},"compare_at_price":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compare At Price","description":"Original price if on sale"},"url":{"type":"string","title":"Url","description":"The original URL that was scraped"}},"type":"object","required":["url"],"title":"ExtractProductUrlResponse","description":"Extracted product data from a URL."},"FailedGeneration":{"properties":{"user_id":{"type":"integer","title":"User Id"},"email":{"type":"string","title":"Email"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"tool_name":{"type":"string","title":"Tool Name"},"source":{"type":"string","title":"Source"},"execution_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Execution Time Ms"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["user_id","email","company","session_id","error_message","prompt","tool_name","source","execution_time_ms","created_at"],"title":"FailedGeneration"},"FastCrawlRequest":{"properties":{"website_url":{"type":"string","title":"Website Url","description":"Website URL to crawl"}},"type":"object","required":["website_url"],"title":"FastCrawlRequest","description":"Request body for fast crawl (logo + screenshot only)."},"FastCrawlResponse":{"properties":{"website_id":{"type":"integer","title":"Website Id","description":"Saphire website ID"},"url":{"type":"string","title":"Url","description":"Normalized website URL"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name","description":"Detected company name"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url","description":"S3 URL of the primary logo"},"screenshot_urls":{"items":{"type":"string"},"type":"array","title":"Screenshot Urls","description":"S3 URLs of homepage screenshots"},"logos_found":{"type":"integer","title":"Logos Found","description":"Number of logos extracted","default":0},"screenshots_captured":{"type":"integer","title":"Screenshots Captured","description":"Number of screenshots taken","default":0},"elapsed_seconds":{"type":"number","title":"Elapsed Seconds","description":"Time taken in seconds"},"message":{"type":"string","title":"Message","description":"Status message"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Source: 'website' or 'google_maps'"},"gmaps_info":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Gmaps Info","description":"Google Maps metadata when source is google_maps"}},"type":"object","required":["website_id","url","elapsed_seconds","message"],"title":"FastCrawlResponse","description":"Response from fast crawl with S3 URLs for logo and screenshots."},"FeatureFlagResponse":{"properties":{"key":{"type":"string","title":"Key"},"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["key","enabled"],"title":"FeatureFlagResponse"},"FeedbackCreate":{"properties":{"use_case_response":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Use Case Response"},"feature_request":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feature Request"},"feedback_source":{"type":"string","title":"Feedback Source","default":"add_credits_modal"}},"type":"object","title":"FeedbackCreate","description":"Request body for creating feedback."},"FeedbackResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"id":{"type":"integer","title":"Id"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","id","message"],"title":"FeedbackResponse","description":"Response after creating feedback."},"FeedbackValidateRequest":{"properties":{"use_case_response":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Use Case Response"},"feature_request":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Feature Request"}},"type":"object","title":"FeedbackValidateRequest","description":"Request body for validating feedback."},"FeedbackValidateResponse":{"properties":{"is_valid":{"type":"boolean","title":"Is Valid"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["is_valid"],"title":"FeedbackValidateResponse","description":"Response after validating feedback."},"FinalizeUploadProduct":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"s3_key":{"type":"string","title":"S3 Key","description":"S3 key returned from presigned upload"},"s3_url":{"type":"string","title":"S3 Url","description":"Public S3 URL"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"}},"type":"object","required":["name","s3_key","s3_url"],"title":"FinalizeUploadProduct","description":"Single product to finalize after S3 upload."},"FinalizeUploadRequest":{"properties":{"products":{"items":{"$ref":"#/components/schemas/FinalizeUploadProduct"},"type":"array","maxItems":100,"minItems":1,"title":"Products"}},"type":"object","required":["products"],"title":"FinalizeUploadRequest","description":"Request to create DB records after S3 upload."},"ForecastGenerationStats":{"properties":{"forecasts_generated":{"type":"integer","title":"Forecasts Generated","default":0},"forecasts_failed":{"type":"integer","title":"Forecasts Failed","default":0},"total_campaigns":{"type":"integer","title":"Total Campaigns","default":0}},"type":"object","title":"ForecastGenerationStats","description":"Statistics about forecast generation."},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest","description":"Request to send a password reset code to an email."},"ForgotPasswordResponse":{"properties":{"message":{"type":"string","title":"Message"},"expires_in_seconds":{"type":"integer","title":"Expires In Seconds"}},"type":"object","required":["message","expires_in_seconds"],"title":"ForgotPasswordResponse","description":"Response after sending password reset code."},"FriendvibesClaimRequest":{"properties":{"session_id":{"type":"integer","title":"Session Id"}},"type":"object","required":["session_id"],"title":"FriendvibesClaimRequest","description":"Authenticated endpoint: link a friendvibes session to a user after registration."},"FriendvibesCompanyResponse":{"properties":{"id":{"type":"integer","title":"Id"},"company_name":{"type":"string","title":"Company Name"},"company_website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Website"},"company_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Description"},"relevance_rank":{"type":"integer","title":"Relevance Rank"},"crawl_status":{"type":"string","title":"Crawl Status"},"screenshots":{"items":{"$ref":"#/components/schemas/FriendvibesScreenshot"},"type":"array","title":"Screenshots","default":[]}},"type":"object","required":["id","company_name","relevance_rank","crawl_status"],"title":"FriendvibesCompanyResponse","description":"A similar company with its screenshots."},"FriendvibesDiscoverRequest":{"properties":{"company_name":{"type":"string","maxLength":255,"minLength":1,"title":"Company Name"},"business_description":{"type":"string","minLength":1,"title":"Business Description"},"location":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Location","description":"City, Region, Country (e.g. 'Portland, OR, US')"}},"type":"object","required":["company_name","business_description"],"title":"FriendvibesDiscoverRequest","description":"Public endpoint: start friendvibes discovery for a lite user (pre-registration)."},"FriendvibesDiscoverResponse":{"properties":{"session_id":{"type":"integer","title":"Session Id"},"status":{"type":"string","title":"Status"}},"type":"object","required":["session_id","status"],"title":"FriendvibesDiscoverResponse","description":"Response from the discover endpoint."},"FriendvibesScreenshot":{"properties":{"s3_url":{"type":"string","title":"S3 Url"},"display_order":{"type":"integer","title":"Display Order"},"is_logo":{"type":"boolean","title":"Is Logo","default":false}},"type":"object","required":["s3_url","display_order"],"title":"FriendvibesScreenshot","description":"A single screenshot from a similar company."},"FriendvibesSelectedStyleResponse":{"properties":{"session_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Session Id"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"selected_company":{"anyOf":[{"$ref":"#/components/schemas/FriendvibesCompanyResponse"},{"type":"null"}]}},"type":"object","title":"FriendvibesSelectedStyleResponse","description":"Authenticated response for the user's selected demo style."},"FriendvibesStatusResponse":{"properties":{"session_id":{"type":"integer","title":"Session Id"},"status":{"type":"string","title":"Status"},"companies":{"items":{"$ref":"#/components/schemas/FriendvibesCompanyResponse"},"type":"array","title":"Companies","default":[]}},"type":"object","required":["session_id","status"],"title":"FriendvibesStatusResponse","description":"Response from the status polling endpoint."},"FrontendSessionContext":{"properties":{"session_id":{"type":"string","title":"Session Id"},"created_at":{"type":"string","title":"Created At"},"initial_prompt":{"type":"string","title":"Initial Prompt","default":""},"chip_labels":{"items":{"type":"string"},"type":"array","title":"Chip Labels"},"chips":{"items":{"$ref":"#/components/schemas/app__schemas__image_agent_schemas__ChipContext"},"type":"array","title":"Chips"},"product_references":{"items":{"$ref":"#/components/schemas/ProductReferenceContext"},"type":"array","title":"Product References"},"language":{"type":"string","title":"Language","default":"English"},"aspect_ratio":{"type":"string","title":"Aspect Ratio","default":"1:1"},"resolution":{"type":"string","title":"Resolution","default":"1K"},"platform":{"type":"string","title":"Platform","default":""},"platform_icon":{"type":"string","title":"Platform Icon","default":""},"memory":{"anyOf":[{"$ref":"#/components/schemas/MemoryContext"},{"type":"null"}]},"competitor_ad_image_urls":{"items":{"type":"string"},"type":"array","title":"Competitor Ad Image Urls"},"meta_ad_image_urls":{"items":{"type":"string"},"type":"array","title":"Meta Ad Image Urls"},"uploaded_reference_ids":{"items":{"type":"integer"},"type":"array","title":"Uploaded Reference Ids"},"saphire_website_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Saphire Website Id"}},"type":"object","required":["session_id","created_at"],"title":"FrontendSessionContext","description":"Formally typed frontend session context.\n\nPersisted in session JSONB, returned in responses.\nContains all chip selections, memory, platform, language, and reference info."},"GalleryFeedResponse":{"properties":{"images":{"items":{"type":"string"},"type":"array","title":"Images","description":"List of S3 image URLs"},"count":{"type":"integer","title":"Count","description":"Number of images returned"}},"type":"object","required":["images","count"],"title":"GalleryFeedResponse","description":"Response for the public gallery feed endpoint."},"GalleryImageItem":{"properties":{"key":{"type":"string","title":"Key","description":"Unique key (user_id)"},"url":{"type":"string","title":"Url","description":"S3 image URL"}},"type":"object","required":["key","url"],"title":"GalleryImageItem","description":"Single image in the paginated gallery feed."},"GalleryPaginatedResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/GalleryImageItem"},"type":"array","title":"Items","description":"List of gallery images"},"total":{"type":"integer","title":"Total","description":"Total number of images in the feed"},"has_more":{"type":"boolean","title":"Has More","description":"Whether more pages are available"},"offset":{"type":"integer","title":"Offset","description":"Current offset"},"limit":{"type":"integer","title":"Limit","description":"Page size"}},"type":"object","required":["items","total","has_more","offset","limit"],"title":"GalleryPaginatedResponse","description":"Response for the authenticated paginated gallery feed."},"GenerateAdCampaignStartResponse":{"properties":{"profile_id":{"type":"integer","title":"Profile Id"},"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"}},"type":"object","required":["profile_id","status","message"],"title":"GenerateAdCampaignStartResponse","description":"Response when starting async ad campaign generation."},"GenerateAdCampaignStatusResponse":{"properties":{"profile_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Profile Id"},"status":{"type":"string","title":"Status"},"completed":{"type":"boolean","title":"Completed"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"generation_step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generation Step"},"generation_step_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generation Step Error"},"company_profile":{"anyOf":[{"$ref":"#/components/schemas/CompanyProfileDetail"},{"type":"null"}]}},"type":"object","required":["status","completed"],"title":"GenerateAdCampaignStatusResponse","description":"Response when polling ad campaign generation status."},"GenerateCollectionsRequest":{"properties":{"website_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Website Url"}},"type":"object","title":"GenerateCollectionsRequest","description":"Optional request body for generating collections."},"GenerateCompetitorAdPromptRequest":{"properties":{"ad_id":{"type":"string","title":"Ad Id","description":"Ad ID to analyze"},"include_video_thumbnails":{"type":"boolean","title":"Include Video Thumbnails","description":"Include video thumbnails as images","default":true}},"type":"object","required":["ad_id"],"title":"GenerateCompetitorAdPromptRequest","description":"Request to generate ad prompt from a competitor ad."},"GenerateCompetitorAdPromptResponse":{"properties":{"prompt":{"type":"string","title":"Prompt"},"ad_id":{"type":"string","title":"Ad Id"},"images_used":{"type":"integer","title":"Images Used"}},"type":"object","required":["prompt","ad_id","images_used"],"title":"GenerateCompetitorAdPromptResponse","description":"Response with generated ad prompt."},"GenerateProductPromptRequest":{"properties":{"collection_ids":{"items":{"type":"integer"},"type":"array","minItems":1,"title":"Collection Ids","description":"Collection IDs to use for product images"},"template_title":{"type":"string","title":"Template Title","description":"Title of the template style"},"template_description":{"type":"string","title":"Template Description","description":"Description of the template style"},"template_prompt":{"type":"string","title":"Template Prompt","description":"Base prompt from the template"}},"type":"object","required":["collection_ids","template_title","template_description","template_prompt"],"title":"GenerateProductPromptRequest","description":"Request schema for generating product prompts."},"GenerateProductPromptResponse":{"properties":{"prompt":{"type":"string","title":"Prompt","description":"Generated prompt text"}},"type":"object","required":["prompt"],"title":"GenerateProductPromptResponse","description":"Response schema for generated product prompts."},"GenerateTemplatePromptRequest":{"properties":{"ad_image_urls":{"items":{"type":"string"},"type":"array","title":"Ad Image Urls","description":"Meta ad image URLs (style reference)"},"product_image_urls":{"items":{"type":"string"},"type":"array","title":"Product Image Urls","description":"Product image URLs (content reference)","default":[]}},"type":"object","required":["ad_image_urls"],"title":"GenerateTemplatePromptRequest","description":"Request to generate a template prompt from Meta ad + product images."},"GenerateTweetResponse":{"properties":{"tweet":{"type":"string","title":"Tweet"}},"type":"object","required":["tweet"],"title":"GenerateTweetResponse","description":"Response with generated tweet."},"GeneratedImageRecord":{"properties":{"user_id":{"type":"integer","title":"User Id"},"email":{"type":"string","title":"Email"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"is_pro":{"type":"boolean","title":"Is Pro"},"image_url":{"type":"string","title":"Image Url"},"source":{"type":"string","title":"Source"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"generation_time_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Generation Time Ms"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["user_id","email","company","is_pro","image_url","source","session_id","prompt","created_at"],"title":"GeneratedImageRecord"},"GenerationTimeStat":{"properties":{"source":{"type":"string","title":"Source"},"avg_ms":{"type":"number","title":"Avg Ms"},"min_ms":{"type":"number","title":"Min Ms"},"max_ms":{"type":"number","title":"Max Ms"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["source","avg_ms","min_ms","max_ms","count"],"title":"GenerationTimeStat"},"GoogleAdsGenerateResponse":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Celery task ID for polling"},"status":{"type":"string","title":"Status","description":"Task status","default":"pending"},"message":{"type":"string","title":"Message","default":"Keyword plan generation started"},"poll_url":{"type":"string","title":"Poll Url","description":"URL to poll for results"}},"type":"object","required":["task_id","poll_url"],"title":"GoogleAdsGenerateResponse","description":"Response when keyword generation is triggered."},"GoogleAdsStatusResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Task status: active, completed, failed"},"plan_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Plan Id","description":"GoogleAdsKeywordPlan ID when completed"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if failed"},"message":{"type":"string","title":"Message","description":"Human-readable status message"}},"type":"object","required":["status","message"],"title":"GoogleAdsStatusResponse","description":"Response from the status polling endpoint."},"GoogleOAuthRequest":{"properties":{"id_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id Token"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image"},"google_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Google Id"}},"type":"object","title":"GoogleOAuthRequest"},"GrantCreditsRequest":{"properties":{"email":{"type":"string","title":"Email","description":"User email address"},"amount":{"type":"integer","exclusiveMinimum":0.0,"title":"Amount","description":"Number of credits to grant (must be positive)"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Optional free-text reason; stored on the credit transaction"}},"type":"object","required":["email","amount"],"title":"GrantCreditsRequest","description":"Request model for granting credits to a user."},"GrantCreditsResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"user_id":{"type":"integer","title":"User Id"},"user_email":{"type":"string","title":"User Email"},"amount_granted":{"type":"integer","title":"Amount Granted"},"new_balance":{"type":"integer","title":"New Balance"}},"type":"object","required":["status","message","user_id","user_email","amount_granted","new_balance"],"title":"GrantCreditsResponse","description":"Response model for credit grant."},"GrantDailyCreditsRequest":{"properties":{"credits_amount":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Credits Amount","description":"Credits to grant per user","default":5}},"type":"object","title":"GrantDailyCreditsRequest","description":"Request model for granting daily credits."},"GrantDailyCreditsResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"total_users":{"type":"integer","title":"Total Users"},"granted_count":{"type":"integer","title":"Granted Count"},"skipped_count":{"type":"integer","title":"Skipped Count"},"credits_per_user":{"type":"integer","title":"Credits Per User"},"total_credits_distributed":{"type":"integer","title":"Total Credits Distributed"}},"type":"object","required":["success","message","total_users","granted_count","skipped_count","credits_per_user","total_credits_distributed"],"title":"GrantDailyCreditsResponse","description":"Response model for daily credits grant."},"GrantNewSignupCreditsResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"eligible_users":{"type":"integer","title":"Eligible Users"},"granted_count":{"type":"integer","title":"Granted Count"},"skipped_count":{"type":"integer","title":"Skipped Count"},"credits_per_user":{"type":"integer","title":"Credits Per User"},"total_credits_distributed":{"type":"integer","title":"Total Credits Distributed"},"user_emails":{"items":{"type":"string"},"type":"array","title":"User Emails","description":"Emails of users who received credits"}},"type":"object","required":["success","message","eligible_users","granted_count","skipped_count","credits_per_user","total_credits_distributed"],"title":"GrantNewSignupCreditsResponse","description":"Response model for granting credits to new signups who ran out."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImageDownloadRequest":{"properties":{"ad_campaign_ad_id":{"type":"integer","title":"Ad Campaign Ad Id","description":"ID of the ad campaign ad"},"image_url":{"type":"string","title":"Image Url","description":"S3 URL of the downloaded image"}},"type":"object","required":["ad_campaign_ad_id","image_url"],"title":"ImageDownloadRequest","description":"Request model for image download notifications."},"ImageGenerationStats":{"properties":{"images_generated":{"type":"integer","title":"Images Generated","default":0},"images_failed":{"type":"integer","title":"Images Failed","default":0},"total_ads":{"type":"integer","title":"Total Ads","default":0}},"type":"object","title":"ImageGenerationStats","description":"Statistics about image generation."},"ImageJudgeRequest":{"properties":{"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"URL of the image to evaluate (S3 URL or any public image URL)"},"image_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Base64","description":"Base64-encoded image data (alternative to image_url)"},"creative_brief":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creative Brief","description":"The creative brief or prompt used to generate this image."},"brand_context":{"anyOf":[{"$ref":"#/components/schemas/BrandContext"},{"type":"null"}],"description":"Brand information for brand-related criteria evaluation"}},"type":"object","title":"ImageJudgeRequest","description":"Request schema for image quality judgment."},"ImageJudgeResponse":{"properties":{"criteria_scores":{"items":{"$ref":"#/components/schemas/CriterionScore"},"type":"array","title":"Criteria Scores","description":"All 20 criteria scores (1-5 Likert scale)"},"total_score":{"type":"integer","maximum":100.0,"minimum":0.0,"title":"Total Score","description":"Sum of all 20 criteria scores (out of 100)"},"summary":{"type":"string","title":"Summary","description":"Brief natural language summary of the evaluation"}},"type":"object","required":["criteria_scores","total_score","summary"],"title":"ImageJudgeResponse","description":"Response schema for image quality judgment."},"ImageOutput":{"properties":{"image_id":{"type":"string","title":"Image Id","description":"Unique image identifier"},"url":{"type":"string","title":"Url","description":"S3 URL of the image"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url","description":"Thumbnail URL if available"},"ad_image_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ad Image Id","description":"Database AdImage ID when the workspace image was persisted"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata","description":"Image metadata (creative_prompt, dimensions, etc.)"}},"type":"object","required":["image_id","url"],"title":"ImageOutput","description":"Output schema for a generated/edited image."},"InlineReferenceImage":{"properties":{"base64":{"type":"string","title":"Base64"},"format":{"type":"string","title":"Format","default":"png"}},"type":"object","required":["base64"],"title":"InlineReferenceImage","description":"Base64-encoded reference image uploaded inline with the /chat request."},"InvalidateAccountRequest":{"properties":{"email":{"type":"string","title":"Email","description":"User email address to invalidate"}},"type":"object","required":["email"],"title":"InvalidateAccountRequest","description":"Request model for invalidating an account."},"InvalidateAccountResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"user_id":{"type":"integer","title":"User Id"},"original_email":{"type":"string","title":"Original Email"},"new_email":{"type":"string","title":"New Email"},"is_active":{"type":"boolean","title":"Is Active"}},"type":"object","required":["status","message","user_id","original_email","new_email","is_active"],"title":"InvalidateAccountResponse","description":"Response model for account invalidation."},"InviteAgreementRef":{"properties":{"public_id":{"type":"string","format":"uuid","title":"Public Id"},"status":{"type":"string","title":"Status"},"client_signed_at":{"type":"string","format":"date-time","title":"Client Signed At"},"provider_signed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Provider Signed At"}},"type":"object","required":["public_id","status","client_signed_at","provider_signed_at"],"title":"InviteAgreementRef"},"InviteCreate":{"properties":{"company_name":{"type":"string","maxLength":200,"minLength":1,"title":"Company Name"},"company_slug":{"type":"string","maxLength":64,"minLength":2,"title":"Company Slug"},"contact_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Contact Name"},"contact_email":{"anyOf":[{"type":"string","maxLength":254},{"type":"null"}],"title":"Contact Email"},"website_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Website Url"},"ad_buyer":{"type":"boolean","title":"Ad Buyer","default":false},"discount_percentage":{"anyOf":[{"type":"number","exclusiveMaximum":100.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Discount Percentage"},"created_by":{"type":"string","maxLength":200,"minLength":1,"title":"Created By"},"expires_in_days":{"anyOf":[{"type":"integer","maximum":90.0,"minimum":1.0},{"type":"null"}],"title":"Expires In Days"}},"type":"object","required":["company_name","company_slug","created_by"],"title":"InviteCreate"},"InviteCreated":{"properties":{"public_id":{"type":"string","format":"uuid","title":"Public Id"},"status":{"type":"string","title":"Status"},"company_name":{"type":"string","title":"Company Name"},"company_slug":{"type":"string","title":"Company Slug"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"ad_buyer":{"type":"boolean","title":"Ad Buyer","default":false},"discount_percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Discount Percentage"},"created_by":{"type":"string","title":"Created By"},"pixel_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pixel Key"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Used At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"agreement":{"anyOf":[{"$ref":"#/components/schemas/AgreementSummary"},{"type":"null"}]},"token":{"type":"string","title":"Token"},"url":{"type":"string","title":"Url"}},"type":"object","required":["public_id","status","company_name","company_slug","contact_email","created_by","pixel_key","expires_at","used_at","revoked_at","created_at","agreement","token","url"],"title":"InviteCreated"},"InviteInfoResponse":{"properties":{"team_name":{"type":"string","title":"Team Name"},"owner_name":{"type":"string","title":"Owner Name"},"invited_email":{"type":"string","title":"Invited Email"},"status":{"type":"string","title":"Status"}},"type":"object","required":["team_name","owner_name","invited_email","status"],"title":"InviteInfoResponse","description":"Public info about a pending invite (no auth required)."},"InviteMemberRequest":{"properties":{"email":{"type":"string","pattern":"^[^@]+@[^@]+\\.[^@]+$","title":"Email"}},"type":"object","required":["email"],"title":"InviteMemberRequest"},"InviteOut":{"properties":{"public_id":{"type":"string","format":"uuid","title":"Public Id"},"status":{"type":"string","title":"Status"},"company_name":{"type":"string","title":"Company Name"},"company_slug":{"type":"string","title":"Company Slug"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"ad_buyer":{"type":"boolean","title":"Ad Buyer","default":false},"discount_percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Discount Percentage"},"created_by":{"type":"string","title":"Created By"},"pixel_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pixel Key"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Used At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"agreement":{"anyOf":[{"$ref":"#/components/schemas/AgreementSummary"},{"type":"null"}]}},"type":"object","required":["public_id","status","company_name","company_slug","contact_email","created_by","pixel_key","expires_at","used_at","revoked_at","created_at","agreement"],"title":"InviteOut"},"InviteResolved":{"properties":{"status":{"type":"string","title":"Status"},"company_name":{"type":"string","title":"Company Name"},"company_slug":{"type":"string","title":"Company Slug"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"ad_buyer":{"type":"boolean","title":"Ad Buyer","default":false},"discount_percentage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Discount Percentage"},"pixel_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pixel Key"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"agreement":{"anyOf":[{"$ref":"#/components/schemas/InviteAgreementRef"},{"type":"null"}]}},"type":"object","required":["status","company_name","company_slug","contact_email","pixel_key","expires_at","agreement"],"title":"InviteResolved"},"InvitesList":{"properties":{"invites":{"items":{"$ref":"#/components/schemas/InviteOut"},"type":"array","title":"Invites"}},"type":"object","required":["invites"],"title":"InvitesList"},"LiteEmptyWebsiteRequest":{"properties":{"business_desc":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Business Desc","description":"Business description for context"}},"type":"object","title":"LiteEmptyWebsiteRequest","description":"Request to create empty website for authenticated lite user."},"LoginRequest":{"properties":{"email":{"type":"string","pattern":"^[^@]+@[^@]+\\.[^@]+$","title":"Email"},"password":{"type":"string","minLength":6,"title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"LookupBusinessRequest":{"properties":{"company_name":{"type":"string","title":"Company Name"},"location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location"}},"type":"object","required":["company_name"],"title":"LookupBusinessRequest"},"LookupBusinessResponse":{"properties":{"descriptions":{"items":{"$ref":"#/components/schemas/BusinessDescriptionOption"},"type":"array","title":"Descriptions","default":[]},"location_detected":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Location Detected"},"website_match":{"anyOf":[{"$ref":"#/components/schemas/WebsiteMatchResponse"},{"type":"null"}]}},"type":"object","title":"LookupBusinessResponse"},"ManualReferenceGenerationHistoryResponse":{"properties":{"website_id":{"type":"integer","title":"Website Id"},"total":{"type":"integer","title":"Total"},"generations":{"items":{"$ref":"#/components/schemas/ManualReferenceGenerationRecord"},"type":"array","title":"Generations"}},"type":"object","required":["website_id","total","generations"],"title":"ManualReferenceGenerationHistoryResponse","description":"Response for generation history endpoint."},"ManualReferenceGenerationRecord":{"properties":{"id":{"type":"integer","title":"Id"},"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","title":"Status"},"prompt":{"type":"string","title":"Prompt"},"aspect_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect Ratio"},"resolution":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution"},"saphire_generation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Saphire Generation Id"},"s3_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S3 Url"},"enhanced_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Enhanced Prompt"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"session_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Session Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["id","job_id","status","prompt","created_at"],"title":"ManualReferenceGenerationRecord","description":"Single generation record in history."},"ManualReferenceImageResponse":{"properties":{"id":{"type":"integer","title":"Id"},"s3_url":{"type":"string","title":"S3 Url"},"display_order":{"type":"integer","title":"Display Order"},"is_logo":{"type":"boolean","title":"Is Logo"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","s3_url","display_order","is_logo"],"title":"ManualReferenceImageResponse","description":"Single uploaded reference image response."},"ManualReferenceListResponse":{"properties":{"website_id":{"type":"integer","title":"Website Id"},"total":{"type":"integer","title":"Total"},"images":{"items":{"$ref":"#/components/schemas/ManualReferenceImageResponse"},"type":"array","title":"Images"}},"type":"object","required":["website_id","total","images"],"title":"ManualReferenceListResponse","description":"Response schema for listing manual reference images."},"ManualReferenceUploadRequest":{"properties":{"images":{"items":{"type":"string"},"type":"array","maxItems":11,"minItems":0,"title":"Images","description":"List of base64-encoded images (first is logo, rest are style references). Can be empty.","default":[]},"formats":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Formats","description":"Optional list of image formats (png, jpg, etc.) - must match images length if provided"}},"type":"object","title":"ManualReferenceUploadRequest","description":"Request to upload manual reference images."},"ManualReferenceUploadResponse":{"properties":{"website_id":{"type":"integer","title":"Website Id"},"images_uploaded":{"type":"integer","title":"Images Uploaded"},"images":{"items":{"$ref":"#/components/schemas/ManualReferenceImageResponse"},"type":"array","title":"Images"}},"type":"object","required":["website_id","images_uploaded","images"],"title":"ManualReferenceUploadResponse","description":"Response from manual reference upload."},"MemoryContext":{"properties":{"product_understanding":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Understanding"},"company_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Description"},"company_facts":{"anyOf":[{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array"},{"type":"null"}],"title":"Company Facts"}},"type":"object","title":"MemoryContext","description":"Memory context (product understanding, company info) from the frontend."},"MessageOutput":{"properties":{"id":{"type":"integer","title":"Id"},"role":{"$ref":"#/components/schemas/MessageRole"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"images":{"items":{"$ref":"#/components/schemas/ImageOutput"},"type":"array","title":"Images"},"tool_calls":{"items":{"$ref":"#/components/schemas/ToolCallOutput"},"type":"array","title":"Tool Calls"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","role","created_at"],"title":"MessageOutput","description":"Output schema for a conversation message."},"MessageRole":{"type":"string","enum":["user","assistant","tool"],"title":"MessageRole","description":"Message role values."},"MetaAdResponse":{"properties":{"ad_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ad Id"},"page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Id"},"page_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Name"},"is_active":{"type":"boolean","title":"Is Active","default":false},"body_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Text"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption"},"cta_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta Text"},"cta_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta Type"},"display_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Format"},"link_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link Url"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"},"impressions_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Impressions Text"},"publisher_platforms":{"items":{"type":"string"},"type":"array","title":"Publisher Platforms","default":[]},"images":{"items":{"type":"string"},"type":"array","title":"Images","default":[]},"videos":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Videos","default":[]},"branded_content_page_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Branded Content Page Name"}},"type":"object","title":"MetaAdResponse","description":"Single Meta ad in response."},"MetaCapiCredentialCreate":{"properties":{"meta_dataset_id":{"type":"string","maxLength":255,"minLength":1,"title":"Meta Dataset Id"},"access_token":{"type":"string","minLength":8,"title":"Access Token"},"event_mappings":{"additionalProperties":{"type":"string"},"type":"object","minProperties":1,"title":"Event Mappings","description":"Explicit Lapis event_type -> Meta event_name mappings."},"label":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Label"},"pixel_api_key_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pixel Api Key Id"},"forward_server_events":{"type":"boolean","title":"Forward Server Events","default":true},"forward_browser_events":{"type":"boolean","title":"Forward Browser Events","default":false},"test_event_code":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Test Event Code"}},"type":"object","required":["meta_dataset_id","access_token","event_mappings"],"title":"MetaCapiCredentialCreate","description":"Credentials and explicit event allowlist for Meta CAPI forwarding."},"MetaCapiCredentialResponse":{"properties":{"id":{"type":"integer","title":"Id"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"meta_dataset_id":{"type":"string","title":"Meta Dataset Id"},"access_token_masked":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token Masked"},"event_mappings":{"additionalProperties":{"type":"string"},"type":"object","title":"Event Mappings"},"test_event_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Event Code"},"pixel_api_key_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pixel Api Key Id"},"forward_server_events":{"type":"boolean","title":"Forward Server Events"},"forward_browser_events":{"type":"boolean","title":"Forward Browser Events","default":false},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_forwarded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Forwarded At"},"last_forward_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Forward Error"}},"type":"object","required":["id","label","meta_dataset_id","access_token_masked","event_mappings","test_event_code","pixel_api_key_id","forward_server_events","is_active","created_at","last_forwarded_at","last_forward_error"],"title":"MetaCapiCredentialResponse"},"MetaCapiCredentialRevealResponse":{"properties":{"id":{"type":"integer","title":"Id"},"meta_dataset_id":{"type":"string","title":"Meta Dataset Id"},"access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Token"}},"type":"object","required":["id","meta_dataset_id","access_token"],"title":"MetaCapiCredentialRevealResponse"},"MetadataBreakdownRow":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"count":{"type":"integer","title":"Count"},"unique_users":{"type":"integer","title":"Unique Users"}},"type":"object","required":["value","count","unique_users"],"title":"MetadataBreakdownRow"},"NotificationResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether notification was sent successfully"},"message":{"type":"string","title":"Message","description":"Status message"}},"type":"object","required":["success","message"],"title":"NotificationResponse","description":"Response model for notification endpoints."},"NudgeEmailRequest":{"properties":{"type":{"type":"string","enum":["cart_abandoned","download_gate"],"title":"Type","description":"Nudge email type: cart_abandoned or download_gate"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"URL of the image the user tried to download (download_gate only)"}},"type":"object","required":["type"],"title":"NudgeEmailRequest","description":"Request model for scheduling nudge emails (cart abandoned / download gate)."},"OAuthRegistrationRequest":{"properties":{"email":{"type":"string","pattern":"^[^@]+@[^@]+\\.[^@]+$","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"company_website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Website","description":"Company website URL"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"providers":{"anyOf":[{"items":{"$ref":"#/components/schemas/ProviderCreateRequest"},"type":"array"},{"type":"null"}],"title":"Providers","description":"Optional list of providers to create"}},"type":"object","required":["email"],"title":"OAuthRegistrationRequest","description":"OAuth registration completion request (no password required)"},"OnboardingDropoffSummary":{"properties":{"step":{"type":"string","title":"Step"},"step_path":{"type":"string","title":"Step Path"},"dropoff_count":{"type":"integer","title":"Dropoff Count"}},"type":"object","required":["step","step_path","dropoff_count"],"title":"OnboardingDropoffSummary"},"OnboardingDropoffUser":{"properties":{"email":{"type":"string","title":"Email"},"user_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"},"last_step":{"type":"string","title":"Last Step"},"step_path":{"type":"string","title":"Step Path"},"last_step_index":{"type":"integer","title":"Last Step Index"},"step_total":{"type":"integer","title":"Step Total"},"is_lite_user":{"type":"boolean","title":"Is Lite User"},"first_seen":{"type":"string","format":"date-time","title":"First Seen"},"last_seen":{"type":"string","format":"date-time","title":"Last Seen"},"steps_viewed":{"type":"integer","title":"Steps Viewed"},"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Campaign"},"referrer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer"},"cta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta"}},"type":"object","required":["email","last_step","step_path","last_step_index","step_total","is_lite_user","first_seen","last_seen","steps_viewed"],"title":"OnboardingDropoffUser"},"OnboardingStepRecord":{"properties":{"email":{"type":"string","title":"Email"},"step":{"type":"string","title":"Step"},"step_path":{"type":"string","title":"Step Path","default":""},"step_index":{"type":"integer","title":"Step Index"},"step_total":{"type":"integer","title":"Step Total"},"is_lite_user":{"type":"boolean","title":"Is Lite User","default":false},"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Campaign"},"referrer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Referrer"},"cta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cta"}},"type":"object","required":["email","step","step_index","step_total"],"title":"OnboardingStepRecord"},"OnboardingSubmitted":{"properties":{"public_id":{"type":"string","format":"uuid","title":"Public Id"},"status":{"type":"string","title":"Status"},"client_signed_at":{"type":"string","format":"date-time","title":"Client Signed At"},"created":{"type":"boolean","title":"Created"}},"type":"object","required":["public_id","status","client_signed_at","created"],"title":"OnboardingSubmitted"},"OpenAIAdsDraftListResponse":{"properties":{"drafts":{"items":{"$ref":"#/components/schemas/OpenAIAdsDraftResponse"},"type":"array","title":"Drafts"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["drafts","total"],"title":"OpenAIAdsDraftListResponse","description":"Paginated list response."},"OpenAIAdsDraftResponse":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"campaign_name":{"type":"string","title":"Campaign Name"},"ad_group_name":{"type":"string","title":"Ad Group Name"},"headline":{"type":"string","title":"Headline"},"description":{"type":"string","title":"Description"},"landing_page_url":{"type":"string","title":"Landing Page Url"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"keywords":{"items":{"type":"string"},"type":"array","title":"Keywords","default":[]},"guidance_short":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guidance Short"},"guidance_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guidance Medium"},"guidance_long":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guidance Long"},"collection_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Collection Id"},"generation_batch_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generation Batch Id"},"utm_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Source"},"utm_medium":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Medium"},"utm_campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Utm Campaign"},"status":{"type":"string","title":"Status"},"model_used":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Used"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["id","user_id","campaign_name","ad_group_name","headline","description","landing_page_url","status","created_at"],"title":"OpenAIAdsDraftResponse","description":"Response schema for a single draft."},"OpenAICapiCredentialCreate":{"properties":{"openai_pixel_id":{"type":"string","maxLength":255,"title":"Openai Pixel Id","description":"Pixel ID from the conversions tab of OpenAI Ads Manager"},"api_key":{"type":"string","minLength":8,"title":"Api Key","description":"Conversions API key from OpenAI Ads Manager (stored encrypted)"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Human-readable label"},"pixel_api_key_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pixel Api Key Id","description":"Optional Lapis pixel key scope. If set, only events attributed to this pixel's sessions are forwarded."},"forward_server_events":{"type":"boolean","title":"Forward Server Events","description":"Auto-forward verified Lapis server events to OpenAI","default":true},"forward_browser_events":{"type":"boolean","title":"Forward Browser Events","description":"Also forward browser pixel conversions + value-ladder rungs","default":false}},"type":"object","required":["openai_pixel_id","api_key"],"title":"OpenAICapiCredentialCreate","description":"Request schema for storing OpenAI Ads CAPI credentials."},"OpenAICapiCredentialResponse":{"properties":{"id":{"type":"integer","title":"Id"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"openai_pixel_id":{"type":"string","title":"Openai Pixel Id"},"api_key_masked":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Masked"},"pixel_api_key_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pixel Api Key Id"},"forward_server_events":{"type":"boolean","title":"Forward Server Events"},"forward_browser_events":{"type":"boolean","title":"Forward Browser Events","default":false},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_forwarded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Forwarded At"},"last_forward_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Forward Error"}},"type":"object","required":["id","label","openai_pixel_id","api_key_masked","pixel_api_key_id","forward_server_events","is_active","created_at","last_forwarded_at","last_forward_error"],"title":"OpenAICapiCredentialResponse","description":"Credential metadata with the API key masked."},"OpenAICapiCredentialRevealResponse":{"properties":{"id":{"type":"integer","title":"Id"},"openai_pixel_id":{"type":"string","title":"Openai Pixel Id"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key","description":"Decrypted API key, or null if decryption failed"}},"type":"object","required":["id","openai_pixel_id"],"title":"OpenAICapiCredentialRevealResponse","description":"Response for re-displaying a stored OpenAI CAPI key."},"OutputFormat":{"type":"string","enum":["pdf","jpeg","png"],"title":"OutputFormat","description":"Supported output formats for print export."},"PauseStripeSubscriptionRequest":{"properties":{"email":{"type":"string","title":"Email","description":"User email address"},"behavior":{"type":"string","title":"Behavior","description":"Stripe pause behavior: 'void', 'mark_uncollectible', or 'keep_as_draft'. Defaults to 'mark_uncollectible' (no invoices issued while paused).","default":"mark_uncollectible"}},"type":"object","required":["email"],"title":"PauseStripeSubscriptionRequest","description":"Request model for pausing a Stripe subscription."},"PauseStripeSubscriptionResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"type":"string","title":"Message"},"user_id":{"type":"integer","title":"User Id"},"user_email":{"type":"string","title":"User Email"},"stripe_subscription_id":{"type":"string","title":"Stripe Subscription Id"},"stripe_subscription_status":{"type":"string","title":"Stripe Subscription Status"},"pause_behavior":{"type":"string","title":"Pause Behavior"},"pause_collection_active":{"type":"boolean","title":"Pause Collection Active"}},"type":"object","required":["status","message","user_id","user_email","stripe_subscription_id","stripe_subscription_status","pause_behavior","pause_collection_active"],"title":"PauseStripeSubscriptionResponse","description":"Response model for Stripe subscription pause."},"PendingClaimResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"PendingClaimResponse","description":"Response after submitting a pending claim."},"PerformanceForecastData":{"properties":{"target_audience_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Audience Size"},"forecasts":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/PerformanceForecastPeriod"},"type":"object"},{"type":"null"}],"title":"Forecasts"}},"type":"object","title":"PerformanceForecastData","description":"Performance forecast data structure."},"PerformanceForecastPeriod":{"properties":{"spend_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Spend Min"},"spend_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Spend Max"},"impressions_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Impressions Min"},"impressions_max":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Impressions Max"},"ctr_min":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ctr Min"},"ctr_max":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Ctr Max"},"clicks_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Clicks Min"},"clicks_max":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Clicks Max"}},"type":"object","title":"PerformanceForecastPeriod","description":"Forecast data for a single time period (1_day, 7_day, 30_day)."},"PerformanceForecastResponse":{"properties":{"status":{"type":"string","title":"Status","default":"pending"},"data":{"anyOf":[{"$ref":"#/components/schemas/PerformanceForecastData"},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"model_used":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Used"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","title":"PerformanceForecastResponse","description":"Performance forecast for a campaign (response schema)."},"PersonaCharacter":{"properties":{"name":{"type":"string","title":"Name"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"type":"string","title":"Description"},"age":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age"},"sex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sex"},"ethnicity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ethnicity"},"setting":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Setting"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"promptAddition":{"type":"string","title":"Promptaddition"},"style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Style"},"character_type_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Character Type Detail"},"image_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Prompt"}},"type":"object","required":["name","description","promptAddition"],"title":"PersonaCharacter"},"PersonaGenerateResponse":{"properties":{"task_id":{"type":"string","title":"Task Id","description":"Celery task ID for polling"},"status":{"type":"string","title":"Status","description":"Task status","default":"pending"},"message":{"type":"string","title":"Message","default":"Persona generation started"},"poll_url":{"type":"string","title":"Poll Url","description":"URL to poll for results"}},"type":"object","required":["task_id","poll_url"],"title":"PersonaGenerateResponse"},"PersonaStatusResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Task status: active, completed, failed"},"characters":{"anyOf":[{"items":{"$ref":"#/components/schemas/PersonaCharacter"},"type":"array"},{"type":"null"}],"title":"Characters"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"message":{"type":"string","title":"Message","description":"Human-readable status message"}},"type":"object","required":["status","message"],"title":"PersonaStatusResponse"},"PixelApiKeyCreate":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Human-readable label (e.g. 'Nike Production')"},"domain":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Domain","description":"Restrict key to this domain (subdomains included). Comma-separated for several, e.g. 'example.com, example.ca'"}},"type":"object","title":"PixelApiKeyCreate","description":"Request schema for creating a pixel API key."},"PixelApiKeyResponse":{"properties":{"id":{"type":"integer","title":"Id"},"api_key":{"type":"string","title":"Api Key"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Domain"},"is_active":{"type":"boolean","title":"Is Active"},"role":{"type":"string","title":"Role","default":"custom"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","api_key","label","domain","is_active","created_at"],"title":"PixelApiKeyResponse","description":"Response schema for a pixel API key."},"PixelAttributionRow":{"properties":{"campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign"},"ad_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ad Group"},"ad_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ad Id"},"sessions":{"type":"integer","title":"Sessions"},"page_views":{"type":"integer","title":"Page Views"},"conversions":{"type":"integer","title":"Conversions"},"revenue_cents":{"type":"integer","title":"Revenue Cents"},"conversion_rate":{"type":"number","title":"Conversion Rate","description":"conversions / sessions"}},"type":"object","required":["campaign","ad_group","ad_id","sessions","page_views","conversions","revenue_cents","conversion_rate"],"title":"PixelAttributionRow","description":"Attribution breakdown per campaign/ad_group/ad."},"PixelCredentialsResponse":{"properties":{"user_id":{"type":"integer","title":"User Id"},"pixel_key_id":{"type":"integer","title":"Pixel Key Id"},"pixel_key":{"type":"string","title":"Pixel Key"},"server_key_id":{"type":"integer","title":"Server Key Id"},"server_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Key","description":"Raw sk_live_ secret. Null only if the key predates encrypted storage."},"server_key_prefix":{"type":"string","title":"Server Key Prefix"}},"type":"object","required":["user_id","pixel_key_id","pixel_key","server_key_id","server_key_prefix"],"title":"PixelCredentialsResponse","description":"The user's primary pixel + Conversion API credentials.\n\nServed to the authenticated dashboard settings UI; keys are created\nlazily on first request so every account always has a working pair."},"PixelDevProvisionRequest":{"properties":{"email":{"type":"string","title":"Email","description":"Email of the Lapis user account to provision for"},"client_name":{"type":"string","maxLength":200,"minLength":1,"title":"Client Name","description":"Brand/client name used in key labels (e.g. 'Duradry')"},"domain":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Domain","description":"Restrict the browser key to this domain (recommended; subdomains included). Comma-separated for several, e.g. 'example.com, example.ca'"},"new_server_key":{"type":"boolean","title":"New Server Key","description":"Force-create a new server key even if an active scoped one exists","default":false}},"type":"object","required":["email","client_name"],"title":"PixelDevProvisionRequest","description":"Request schema for dev-side pixel provisioning on behalf of a user."},"PixelDevProvisionResponse":{"properties":{"user_id":{"type":"integer","title":"User Id"},"email":{"type":"string","title":"Email"},"pixel_key_id":{"type":"integer","title":"Pixel Key Id"},"pixel_key":{"type":"string","title":"Pixel Key"},"pixel_key_created":{"type":"boolean","title":"Pixel Key Created"},"server_key_id":{"type":"integer","title":"Server Key Id"},"server_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Key","description":"Raw sk_live_ secret. Null only if an existing key predates encrypted storage; rerun with new_server_key=true."},"server_key_prefix":{"type":"string","title":"Server Key Prefix"},"server_key_created":{"type":"boolean","title":"Server Key Created"}},"type":"object","required":["user_id","email","pixel_key_id","pixel_key","pixel_key_created","server_key_id","server_key_prefix","server_key_created"],"title":"PixelDevProvisionResponse","description":"Full credential set returned to the dev for client handoff."},"PixelEventSummaryRow":{"properties":{"event_type":{"type":"string","title":"Event Type"},"campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign"},"ad_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ad Group"},"ad_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ad Id"},"events":{"type":"integer","title":"Events"},"server_events":{"type":"integer","title":"Server Events"},"browser_events":{"type":"integer","title":"Browser Events"},"verified_events":{"type":"integer","title":"Verified Events"}},"type":"object","required":["event_type","campaign","ad_group","ad_id","events","server_events","browser_events","verified_events"],"title":"PixelEventSummaryRow","description":"Event-level reporting row grouped by event type and attribution fields."},"PixelFunnelResponse":{"properties":{"campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign"},"ad_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ad Group"},"sessions":{"type":"integer","title":"Sessions"},"page_views":{"type":"integer","title":"Page Views"},"conversions":{"type":"integer","title":"Conversions"},"revenue_cents":{"type":"integer","title":"Revenue Cents"},"currency":{"type":"string","title":"Currency","default":"USD"}},"type":"object","required":["campaign","ad_group","sessions","page_views","conversions","revenue_cents"],"title":"PixelFunnelResponse","description":"Funnel metrics: sessions → page views → conversions → revenue."},"PixelOpenAIEventBatchIn":{"properties":{"validate_only":{"type":"boolean","title":"Validate Only","default":false},"events":{"items":{"$ref":"#/components/schemas/PixelOpenAIEventIn"},"type":"array","maxItems":1000,"minItems":1,"title":"Events"},"lapis_click_id":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Lapis Click Id"}},"additionalProperties":true,"type":"object","required":["events"],"title":"PixelOpenAIEventBatchIn","description":"OpenAI Conversions API-compatible event envelope."},"PixelOpenAIEventIn":{"properties":{"id":{"type":"string","maxLength":255,"minLength":1,"title":"Id"},"type":{"type":"string","maxLength":100,"minLength":1,"title":"Type"},"timestamp_ms":{"type":"integer","minimum":0.0,"title":"Timestamp Ms"},"custom_event_name":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Custom Event Name"},"oppref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oppref"},"source_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Source Url"},"action_source":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Action Source"},"user":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"User"},"opt_out":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Opt Out","default":false},"data":{"additionalProperties":true,"type":"object","title":"Data"},"lapis_click_id":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Lapis Click Id"}},"additionalProperties":true,"type":"object","required":["id","type","timestamp_ms","data"],"title":"PixelOpenAIEventIn","description":"OpenAI Ads event accepted by the server-events compatibility layer."},"PixelServerApiKeyCreate":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Human-readable key label"},"pixel_api_key_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pixel Api Key Id","description":"Optional public pixel key scope. If set, server events can only attach to sessions from this pixel key."}},"type":"object","title":"PixelServerApiKeyCreate","description":"Request schema for creating a backend-only server event key."},"PixelServerApiKeyCreateResponse":{"properties":{"id":{"type":"integer","title":"Id"},"key_prefix":{"type":"string","title":"Key Prefix"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"pixel_api_key_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pixel Api Key Id"},"is_active":{"type":"boolean","title":"Is Active"},"role":{"type":"string","title":"Role","default":"custom"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"secret_key":{"type":"string","title":"Secret Key"}},"type":"object","required":["id","key_prefix","label","pixel_api_key_id","is_active","created_at","last_used_at","revoked_at","secret_key"],"title":"PixelServerApiKeyCreateResponse","description":"Create response that includes the raw secret exactly once."},"PixelServerApiKeyResponse":{"properties":{"id":{"type":"integer","title":"Id"},"key_prefix":{"type":"string","title":"Key Prefix"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"pixel_api_key_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pixel Api Key Id"},"is_active":{"type":"boolean","title":"Is Active"},"role":{"type":"string","title":"Role","default":"custom"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"}},"type":"object","required":["id","key_prefix","label","pixel_api_key_id","is_active","created_at","last_used_at","revoked_at"],"title":"PixelServerApiKeyResponse","description":"Response schema for server API key metadata."},"PixelServerApiKeyRevealResponse":{"properties":{"id":{"type":"integer","title":"Id"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"secret_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret Key","description":"Decrypted secret, or null if no re-displayable copy exists"}},"type":"object","required":["id","label"],"title":"PixelServerApiKeyRevealResponse","description":"Response for re-displaying a stored server key secret."},"PixelServerEventBatchResponse":{"properties":{"accepted":{"type":"boolean","title":"Accepted","default":true},"events":{"items":{"$ref":"#/components/schemas/PixelServerEventResponse"},"type":"array","title":"Events"}},"type":"object","required":["events"],"title":"PixelServerEventBatchResponse","description":"Response for a normalized OpenAI-compatible event batch."},"PixelServerEventIn":{"properties":{"event_id":{"type":"string","maxLength":255,"title":"Event Id","description":"Stable unique event id generated by the event producer"},"event_type":{"type":"string","maxLength":100,"title":"Event Type","description":"Client-defined event name, lowercase snake_case"},"lapis_click_id":{"type":"string","maxLength":100,"title":"Lapis Click Id","description":"Attribution id handed off from Lapis pixel session"},"occurred_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Occurred At","description":"When the event happened in the client system"},"external_user_id":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"External User Id","description":"Client-side user id. Stored hashed, not raw."},"external_user_id_hash":{"anyOf":[{"type":"string","maxLength":64,"minLength":64,"pattern":"^[0-9a-fA-F]{64}$"},{"type":"null"}],"title":"External User Id Hash","description":"Pre-hashed external user id from a compatible event source."},"email_sha256":{"anyOf":[{"type":"string","maxLength":64,"minLength":64,"pattern":"^[0-9a-fA-F]{64}$"},{"type":"null"}],"title":"Email Sha256","description":"SHA-256 normalized email for provider-side event matching."},"phone_sha256":{"anyOf":[{"type":"string","maxLength":64,"minLength":64,"pattern":"^[0-9a-fA-F]{64}$"},{"type":"null"}],"title":"Phone Sha256","description":"SHA-256 normalized phone number for provider-side event matching."},"value":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Value","description":"Event value in dollars"},"currency":{"anyOf":[{"type":"string","maxLength":3,"minLength":3},{"type":"null"}],"title":"Currency","default":"USD"},"properties":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Properties","description":"Arbitrary JSON event metadata and provider matching fields"}},"type":"object","required":["event_id","event_type","lapis_click_id"],"title":"PixelServerEventIn","description":"Server-side event payload from a client backend."},"PixelServerEventResponse":{"properties":{"accepted":{"type":"boolean","title":"Accepted","default":true},"matched":{"type":"boolean","title":"Matched","default":false},"duplicate":{"type":"boolean","title":"Duplicate","default":false},"event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Id"},"event_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"campaign":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Campaign"},"ad_group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ad Group"},"ad_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ad Id"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","title":"PixelServerEventResponse","description":"Response for server-side event ingestion."},"PresignedUploadFileRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"Product name"},"format":{"type":"string","title":"Format","description":"Image format (jpg, png, webp, gif)"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"}},"type":"object","required":["name","format"],"title":"PresignedUploadFileRequest","description":"Single file metadata for requesting a presigned upload URL."},"PresignedUploadInfo":{"properties":{"index":{"type":"integer","title":"Index"},"s3_key":{"type":"string","title":"S3 Key"},"upload_url":{"type":"string","title":"Upload Url"},"s3_url":{"type":"string","title":"S3 Url"},"content_type":{"type":"string","title":"Content Type"},"expires_in":{"type":"integer","title":"Expires In"}},"type":"object","required":["index","s3_key","upload_url","s3_url","content_type","expires_in"],"title":"PresignedUploadInfo","description":"Presigned upload URL info for a single file."},"PresignedUploadRequest":{"properties":{"files":{"items":{"$ref":"#/components/schemas/PresignedUploadFileRequest"},"type":"array","maxItems":100,"minItems":1,"title":"Files","description":"Files to upload (max 100)"}},"type":"object","required":["files"],"title":"PresignedUploadRequest","description":"Request for presigned upload URLs."},"PresignedUploadResponse":{"properties":{"uploads":{"items":{"$ref":"#/components/schemas/PresignedUploadInfo"},"type":"array","title":"Uploads"}},"type":"object","required":["uploads"],"title":"PresignedUploadResponse","description":"Response with presigned upload URLs."},"PreviewImageItem":{"properties":{"url":{"type":"string","title":"Url"},"content_type":{"type":"string","title":"Content Type"},"size_bytes":{"type":"integer","title":"Size Bytes"},"data_base64":{"type":"string","title":"Data Base64"}},"type":"object","required":["url","content_type","size_bytes","data_base64"],"title":"PreviewImageItem"},"PreviewImageRequest":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"urls":{"items":{"type":"string"},"type":"array","title":"Urls"}},"type":"object","title":"PreviewImageRequest"},"PreviewImageResponse":{"properties":{"images":{"items":{"$ref":"#/components/schemas/PreviewImageItem"},"type":"array","title":"Images"}},"type":"object","required":["images"],"title":"PreviewImageResponse"},"PrintFormat":{"type":"string","enum":["a3_portrait","a3_landscape","a4_portrait","a4_landscape"],"title":"PrintFormat","description":"Supported print formats for A3/A4 export."},"PrintMetadata":{"properties":{"aspect_ratio":{"type":"string","title":"Aspect Ratio","description":"Aspect ratio used (e.g., '2:3')"},"page_size":{"type":"string","title":"Page Size","description":"Page size (A3 or A4)"},"orientation":{"type":"string","title":"Orientation","description":"Orientation (portrait or landscape)"},"dimensions_mm":{"items":{"type":"integer"},"type":"array","title":"Dimensions Mm","description":"Page dimensions in mm [width, height]"},"dimensions_px":{"items":{"type":"integer"},"type":"array","title":"Dimensions Px","description":"Final image dimensions in pixels [width, height]"},"dpi":{"type":"integer","title":"Dpi","description":"DPI used for pixel dimensions","default":300}},"type":"object","required":["aspect_ratio","page_size","orientation","dimensions_mm","dimensions_px"],"title":"PrintMetadata","description":"Metadata about the print export."},"ProductCreateBody":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"landing_page_url":{"type":"string","maxLength":2048,"minLength":1,"title":"Landing Page Url"},"image_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Image Url"},"is_active":{"type":"boolean","title":"Is Active","default":true}},"type":"object","required":["name","landing_page_url"],"title":"ProductCreateBody"},"ProductImageUploadRequest":{"properties":{"collection_name":{"type":"string","maxLength":255,"minLength":1,"title":"Collection Name","description":"Name for the new collection"},"images":{"items":{"type":"string"},"type":"array","maxItems":10,"minItems":1,"title":"Images","description":"Base64-encoded images (max 10)"},"formats":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Formats","description":"Optional list of image formats (png, jpg, etc.) - must match images length if provided"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description","description":"Optional description for the collection"}},"type":"object","required":["collection_name","images"],"title":"ProductImageUploadRequest","description":"Request schema for uploading product images to create a collection."},"ProductImageUploadResponse":{"properties":{"collection_id":{"type":"integer","title":"Collection Id","description":"ID of the created collection"},"group_id":{"type":"integer","title":"Group Id","description":"ID of the collection group"},"collection_name":{"type":"string","title":"Collection Name","description":"Name of the created collection"},"collection_slug":{"type":"string","title":"Collection Slug","description":"URL-friendly slug of the collection"},"images_uploaded":{"type":"integer","title":"Images Uploaded","description":"Number of images successfully uploaded"},"images":{"items":{"$ref":"#/components/schemas/UploadedImageInfo"},"type":"array","title":"Images","description":"Details of uploaded images"},"saphire_website_id":{"type":"integer","title":"Saphire Website Id","description":"Saphire website ID"}},"type":"object","required":["collection_id","group_id","collection_name","collection_slug","images_uploaded","saphire_website_id"],"title":"ProductImageUploadResponse","description":"Response schema for product image upload."},"ProductReferenceContext":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"thumbnail_url":{"type":"string","title":"Thumbnail Url","default":""},"image_urls":{"items":{"type":"string"},"type":"array","title":"Image Urls"}},"type":"object","required":["id","name"],"title":"ProductReferenceContext","description":"A product reference selected in the frontend."},"PromoCheckoutSessionRequest":{"properties":{"promotion_id":{"type":"string","title":"Promotion Id"},"success_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Success Url"},"cancel_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancel Url"}},"type":"object","required":["promotion_id"],"title":"PromoCheckoutSessionRequest","description":"Request body for creating a promotional subscription checkout session."},"ProviderCreateRequest":{"properties":{"name":{"type":"string","minLength":1,"title":"Name","description":"Provider name"},"model":{"type":"string","minLength":1,"title":"Model","description":"Model name"},"max_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Tokens","description":"Max tokens"},"temperature":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Temperature","description":"Temperature","default":0.7},"weight":{"type":"number","exclusiveMinimum":0.0,"title":"Weight","description":"Weight","default":1.0},"active":{"type":"boolean","title":"Active","default":true},"monthly_budget_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Budget Usd","description":"Monthly budget"}},"type":"object","required":["name","model"],"title":"ProviderCreateRequest","description":"Provider creation request for registration."},"RawEventResponse":{"properties":{"rows":{"items":{"$ref":"#/components/schemas/RawEventRow"},"type":"array","title":"Rows"},"total_count":{"type":"integer","title":"Total Count"}},"type":"object","required":["rows","total_count"],"title":"RawEventResponse"},"RawEventRow":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"email":{"type":"string","title":"Email"},"is_pro":{"type":"boolean","title":"Is Pro"},"event_type":{"type":"string","title":"Event Type"},"event_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Source"},"event_metadata":{"anyOf":[{},{"type":"null"}],"title":"Event Metadata"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","user_id","email","is_pro","event_type","event_source","event_metadata","created_at"],"title":"RawEventRow"},"ReferenceAdImageRead":{"properties":{"id":{"type":"integer","title":"Id"},"s3_url":{"type":"string","title":"S3 Url"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","s3_url","created_at"],"title":"ReferenceAdImageRead","description":"Response schema for a reference ad image."},"RegenerateResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"characters":{"anyOf":[{"items":{"$ref":"#/components/schemas/CharacterSchema"},"type":"array"},{"type":"null"}],"title":"Characters"},"styles":{"anyOf":[{"items":{"$ref":"#/components/schemas/StyleSchema"},"type":"array"},{"type":"null"}],"title":"Styles"},"memory":{"anyOf":[{"$ref":"#/components/schemas/ContextMemory"},{"type":"null"}]}},"type":"object","required":["success","message"],"title":"RegenerateResponse","description":"Response from regeneration request."},"RegisterRequest":{"properties":{"email":{"type":"string","pattern":"^[^@]+@[^@]+\\.[^@]+$","title":"Email"},"password":{"type":"string","minLength":6,"title":"Password"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"company_short_desc":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Company Short Desc","description":"Short company description"},"is_pro":{"type":"boolean","title":"Is Pro","description":"True = pro user (full Saphire flow), False = lite user (Lite Studio only)","default":true},"is_lite_enhanced":{"type":"boolean","title":"Is Lite Enhanced","description":"True = new lite-enhanced user, False = legacy lite user","default":false}},"type":"object","required":["email","password"],"title":"RegisterRequest","description":"Basic registration - email, password, and name only.\n\nUse PATCH /auth/profile to set company and company_website after registration."},"RenewalCronResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"stripe_renewed":{"type":"integer","title":"Stripe Renewed"},"stripe_already_renewed":{"type":"integer","title":"Stripe Already Renewed"},"stripe_skipped":{"type":"integer","title":"Stripe Skipped"},"appsumo_renewed":{"type":"integer","title":"Appsumo Renewed"},"appsumo_already_renewed":{"type":"integer","title":"Appsumo Already Renewed"},"appsumo_skipped":{"type":"integer","title":"Appsumo Skipped"},"appsumo_failed":{"type":"integer","title":"Appsumo Failed","default":0},"failed_user_ids":{"items":{"type":"integer"},"type":"array","title":"Failed User Ids"},"total_credits_distributed":{"type":"integer","title":"Total Credits Distributed"}},"type":"object","required":["success","message","stripe_renewed","stripe_already_renewed","stripe_skipped","appsumo_renewed","appsumo_already_renewed","appsumo_skipped","total_credits_distributed"],"title":"RenewalCronResponse"},"ReplaceLogoRequest":{"properties":{"logo_base64":{"type":"string","title":"Logo Base64","description":"Base64-encoded logo image"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format","description":"Image format (png, jpg, webp)","default":"png"}},"type":"object","required":["logo_base64"],"title":"ReplaceLogoRequest","description":"Request to replace/add the brand logo without affecting style references."},"ReplaceLogoResponse":{"properties":{"id":{"type":"integer","title":"Id"},"s3_url":{"type":"string","title":"S3 Url"},"display_order":{"type":"integer","title":"Display Order","default":0},"is_logo":{"type":"boolean","title":"Is Logo","default":true},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","s3_url"],"title":"ReplaceLogoResponse","description":"Response from logo replacement."},"ResetPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"code":{"type":"string","maxLength":6,"minLength":6,"pattern":"^\\d{6}$","title":"Code"},"reset_token":{"type":"string","title":"Reset Token","description":"Token from verification step"},"new_password":{"type":"string","minLength":6,"title":"New Password"}},"type":"object","required":["email","code","reset_token","new_password"],"title":"ResetPasswordRequest","description":"Request to reset password after verification."},"ResetPasswordResponse":{"properties":{"message":{"type":"string","title":"Message"},"success":{"type":"boolean","title":"Success"}},"type":"object","required":["message","success"],"title":"ResetPasswordResponse","description":"Response after resetting password."},"ResizeByUrlRequest":{"properties":{"image_url":{"type":"string","title":"Image Url","description":"URL of the source image to resize"},"target_aspect_ratio":{"$ref":"#/components/schemas/AspectRatio","description":"Target aspect ratio for the resized image"}},"type":"object","required":["image_url","target_aspect_ratio"],"title":"ResizeByUrlRequest","description":"Request to resize an image by URL (no AdImage record needed)."},"ResizeByUrlResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"resized_image_url":{"type":"string","title":"Resized Image Url","description":"URL of the resized image"},"source_aspect_ratio":{"type":"string","title":"Source Aspect Ratio","description":"Detected source aspect ratio"},"target_aspect_ratio":{"type":"string","title":"Target Aspect Ratio","description":"Target aspect ratio"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","resized_image_url","source_aspect_ratio","target_aspect_ratio","message"],"title":"ResizeByUrlResponse","description":"Response from URL-based resize operation."},"ResizeImageRequest":{"properties":{"ad_image_id":{"type":"integer","title":"Ad Image Id","description":"ID of the source AdImage to resize (must be square)"},"target_aspect_ratio":{"$ref":"#/components/schemas/AspectRatio","description":"Target aspect ratio for the resized image"}},"type":"object","required":["ad_image_id","target_aspect_ratio"],"title":"ResizeImageRequest","description":"Request to resize an ad image to a different aspect ratio."},"ResizeImageResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"source_image":{"$ref":"#/components/schemas/AdImageResponse","description":"The original square image that was resized"},"resized_image":{"$ref":"#/components/schemas/AdImageResponse","description":"The newly created resized image"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","source_image","resized_image","message"],"title":"ResizeImageResponse","description":"Response from resize operation."},"RewardAmountsResponse":{"properties":{"rewards":{"additionalProperties":true,"type":"object","title":"Rewards"}},"type":"object","required":["rewards"],"title":"RewardAmountsResponse","description":"Response with all reward amounts."},"SaphireBrandAssetsInfo":{"properties":{"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"logo_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Type"},"colors":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Colors"},"fonts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Fonts"}},"type":"object","title":"SaphireBrandAssetsInfo","description":"Brand assets used in generation."},"SaphireBrandAssetsResponse":{"properties":{"brand_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Name"},"logos":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Logos"},"brand_colors":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Brand Colors"},"background_colors":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Background Colors"},"fonts":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Fonts"},"personality":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Personality"},"components":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Components"},"typography":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Typography"},"spacing":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Spacing"},"design_system":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Design System"},"og_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Og Image"},"site_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Site Description"},"social_links":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Social Links"}},"type":"object","title":"SaphireBrandAssetsResponse","description":"Brand assets from Saphire brand-kit endpoint.\n\nFonts now include detailed information:\n- id: Saphire font ID\n- font_name: Human-readable font name\n- font_family: CSS font-family value\n- font_url: URL to font file (e.g., woff2)\n- font_format: File format (woff2, woff, ttf, etc.)\n- font_weight: Font weight (400, 700, etc.)\n- font_style: Font style (normal, italic, etc.)\n- font_type: Font classification (mono, sans-serif, serif, etc.)\n- source: Font source (google-fonts, custom, etc.)\n- is_variable: Whether it's a variable font (\"yes\" or \"no\")\n- google_fonts_url: Google Fonts URL if applicable"},"SaphireImageGenerationStatusResponse":{"properties":{"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","title":"Created At"},"started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completed At"},"generation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Generation Id"},"image_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Base64"},"s3_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S3 Url"},"enhanced_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Enhanced Prompt"},"final_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Final Prompt"},"creative_brief":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Creative Brief"},"reference_images_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reference Images Used"},"reference_images":{"items":{"$ref":"#/components/schemas/SaphireReferenceImageInfo"},"type":"array","title":"Reference Images"},"brand_assets":{"anyOf":[{"$ref":"#/components/schemas/SaphireBrandAssetsInfo"},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["job_id","status","created_at"],"title":"SaphireImageGenerationStatusResponse","description":"Response schema for async generation status polling."},"SaphireImageResponse":{"properties":{"id":{"type":"integer","title":"Id"},"ad_id":{"type":"integer","title":"Ad Id"},"saphire_generation_id":{"type":"integer","title":"Saphire Generation Id"},"s3_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S3 Url"},"enhanced_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Enhanced Prompt"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","ad_id","saphire_generation_id"],"title":"SaphireImageResponse","description":"Response schema for a single SaphireImage record."},"SaphireReferenceImageInfo":{"properties":{"url":{"type":"string","title":"Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Score"}},"type":"object","required":["url"],"title":"SaphireReferenceImageInfo","description":"Reference image info used in generation."},"SaphireWebsiteSummary":{"properties":{"id":{"type":"integer","title":"Id"},"saphire_website_id":{"type":"integer","title":"Saphire Website Id"},"pages_crawled":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pages Crawled"},"assets_found":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Assets Found"},"logos_found":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Logos Found"},"brand_colors_found":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Brand Colors Found"},"fonts_found":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fonts Found"},"brand_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Name"},"brand_assets":{"anyOf":[{"$ref":"#/components/schemas/SaphireBrandAssetsResponse"},{"type":"null"}]}},"type":"object","required":["id","saphire_website_id"],"title":"SaphireWebsiteSummary","description":"Summary of Saphire website crawl data."},"SaveImageToAdRequest":{"properties":{"image_id":{"type":"string","title":"Image Id","description":"ID of the image in workspace to save"}},"type":"object","required":["image_id"],"title":"SaveImageToAdRequest","description":"Request to save a workspace image to an AdCampaignAd."},"SaveImageToAdResponse":{"properties":{"ad_id":{"type":"integer","title":"Ad Id","description":"ID of the updated AdCampaignAd"},"primary_image_id":{"type":"integer","title":"Primary Image Id","description":"ID of the primary AdImage"},"primary_image_url":{"type":"string","title":"Primary Image Url","description":"S3 URL of the primary image"},"headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Headline","description":"Headline text if present"},"subtext":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subtext","description":"Subtext if present"},"message":{"type":"string","title":"Message","description":"Success message"}},"type":"object","required":["ad_id","primary_image_id","primary_image_url","message"],"title":"SaveImageToAdResponse","description":"Response when image is saved to AdCampaignAd."},"SeedDesignCreate":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"source":{"type":"string","maxLength":100,"minLength":1,"title":"Source"},"source_url":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Source Url"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"s3_key":{"type":"string","maxLength":500,"minLength":1,"title":"S3 Key"},"s3_url":{"type":"string","maxLength":1000,"minLength":1,"title":"S3 Url"}},"type":"object","required":["name","source","s3_key","s3_url"],"title":"SeedDesignCreate"},"SeedDesignListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SeedDesignRead"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"offset":{"type":"integer","title":"Offset"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["items","total","offset","limit"],"title":"SeedDesignListResponse"},"SeedDesignRead":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"s3_key":{"type":"string","title":"S3 Key"},"s3_url":{"type":"string","title":"S3 Url"},"source":{"type":"string","title":"Source"},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","s3_key","s3_url","source","created_at"],"title":"SeedDesignRead"},"SeedDesignUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Name"},"source":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Source"},"source_url":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Source Url"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","title":"SeedDesignUpdate"},"SendPhoneVerificationRequest":{"properties":{"phone":{"type":"string","maxLength":15,"minLength":10,"title":"Phone","description":"Phone number (digits only)"},"country":{"type":"string","enum":["US","IN","CN","DE","JP","GB","FR","IT","BR","CA","MX","AU","KR","ES","ID","TR","NL","CH","AR","BE"],"title":"Country","description":"Country code for phone number formatting","default":"US"}},"type":"object","required":["phone"],"title":"SendPhoneVerificationRequest","description":"Request to send a verification code via WhatsApp."},"SendPhoneVerificationResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"expires_in_seconds":{"type":"integer","title":"Expires In Seconds","default":0},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Generated email for the phone (user+{phone}@trylapis.com)"}},"type":"object","required":["success","message"],"title":"SendPhoneVerificationResponse","description":"Response after sending phone verification code."},"SendVerificationRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"SendVerificationRequest","description":"Request to send a verification code to an email."},"SendVerificationResponse":{"properties":{"message":{"type":"string","title":"Message"},"expires_in_seconds":{"type":"integer","title":"Expires In Seconds"}},"type":"object","required":["message","expires_in_seconds"],"title":"SendVerificationResponse","description":"Response after sending verification code."},"ServiceTokenResponse":{"properties":{"token":{"type":"string","title":"Token"},"expires_at":{"type":"string","title":"Expires At"}},"type":"object","required":["token","expires_at"],"title":"ServiceTokenResponse"},"SessionDetail":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"status":{"$ref":"#/components/schemas/SessionStatus"},"context":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Context"},"workspace":{"$ref":"#/components/schemas/WorkspaceOutput"},"saphire_website_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Saphire Website Id"},"ad_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ad Id","description":"Source AdCampaignAd ID if context was loaded from database"},"manual_reference_generation_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Manual Reference Generation Id","description":"Source ManualReferenceGeneration ID if image was loaded from there"},"messages":{"items":{"$ref":"#/components/schemas/MessageOutput"},"type":"array","title":"Messages"},"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","status","workspace","created_at","updated_at"],"title":"SessionDetail","description":"Detailed schema for a session with full conversation."},"SessionReferenceImageOutput":{"properties":{"id":{"type":"integer","title":"Id","description":"Database ID of the reference image"},"s3_url":{"type":"string","title":"S3 Url","description":"Public S3 URL of the uploaded image"},"display_order":{"type":"integer","title":"Display Order","description":"Display order (0 = logo)"},"is_logo":{"type":"boolean","title":"Is Logo","description":"Whether this is the logo image"}},"type":"object","required":["id","s3_url","display_order","is_logo"],"title":"SessionReferenceImageOutput","description":"Single uploaded session reference image."},"SessionReferenceUploadRequest":{"properties":{"session_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Session Id","description":"Existing session ID to add references to. If not provided, a new session is created."},"images":{"items":{"type":"string"},"type":"array","maxItems":15,"minItems":1,"title":"Images","description":"List of base64-encoded images. First is logo, rest are style references."},"formats":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Formats","description":"Optional list of image formats (png, jpg, etc.) - must match images length if provided"}},"type":"object","required":["images"],"title":"SessionReferenceUploadRequest","description":"Request to upload session reference images."},"SessionReferenceUploadResponse":{"properties":{"session_id":{"type":"integer","title":"Session Id","description":"Session ID (new or existing)"},"images_uploaded":{"type":"integer","title":"Images Uploaded","description":"Number of images uploaded"},"reference_image_urls":{"items":{"type":"string"},"type":"array","title":"Reference Image Urls","description":"List of S3 URLs to pass as context.reference_images"},"images":{"items":{"$ref":"#/components/schemas/SessionReferenceImageOutput"},"type":"array","title":"Images","description":"Detailed image info"}},"type":"object","required":["session_id","images_uploaded","reference_image_urls","images"],"title":"SessionReferenceUploadResponse","description":"Response from session reference upload."},"SessionStatus":{"type":"string","enum":["active","completed","archived","disabled"],"title":"SessionStatus","description":"Session status values."},"SessionSummary":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"$ref":"#/components/schemas/SessionStatus"},"image_count":{"type":"integer","title":"Image Count","description":"Number of images in workspace","default":0},"message_count":{"type":"integer","title":"Message Count","description":"Number of messages in conversation","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"preview_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Text","description":"First user message or session description"},"preview_image_urls":{"items":{"type":"string"},"type":"array","title":"Preview Image Urls","description":"Up to 3 most recent image URLs"}},"type":"object","required":["id","status","created_at","updated_at"],"title":"SessionSummary","description":"Summary schema for listing sessions."},"SetPrimaryImageRequest":{"properties":{"image_id":{"type":"string","title":"Image Id","description":"ID of the image to set as primary"}},"type":"object","required":["image_id"],"title":"SetPrimaryImageRequest","description":"Request to set the primary image for a session."},"SetupUserAdsRequest":{"properties":{"facebook_url":{"type":"string","title":"Facebook Url","description":"User's Facebook page URL (e.g., https://facebook.com/yourpage)"}},"type":"object","required":["facebook_url"],"title":"SetupUserAdsRequest","description":"Request to set up user's own ads by providing Facebook page URL."},"Signature":{"properties":{"kind":{"type":"string","enum":["typed","drawn"],"title":"Kind"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"paths":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Paths"},"viewBox":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Viewbox"}},"type":"object","required":["kind"],"title":"Signature"},"SignupStats":{"properties":{"pro_signups":{"type":"integer","title":"Pro Signups"},"lite_signups":{"type":"integer","title":"Lite Signups"}},"type":"object","required":["pro_signups","lite_signups"],"title":"SignupStats"},"SingleProductImageUpload":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"Product name (becomes collection name)"},"image":{"type":"string","title":"Image","description":"Base64-encoded image"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format","description":"Image format (png, jpg, etc.)"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description","description":"Optional product description"}},"type":"object","required":["name","image"],"title":"SingleProductImageUpload","description":"Single product for batch upload."},"SingleProductUploadResult":{"properties":{"index":{"type":"integer","title":"Index","description":"Original index in the request"},"success":{"type":"boolean","title":"Success"},"collection_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Collection Id"},"collection_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Collection Name"},"collection_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Collection Slug"},"s3_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S3 Url"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["index","success"],"title":"SingleProductUploadResult","description":"Result for a single product upload within a batch."},"SiteCheckOut":{"properties":{"public_id":{"type":"string","title":"Public Id"},"kind":{"type":"string","title":"Kind"},"status":{"type":"string","title":"Status"},"url":{"type":"string","title":"Url"},"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"attempts":{"type":"integer","title":"Attempts"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"poll_after_seconds":{"type":"integer","title":"Poll After Seconds"}},"type":"object","required":["public_id","kind","status","url","result","error","attempts","created_at","started_at","finished_at","poll_after_seconds"],"title":"SiteCheckOut"},"SiteCheckRequest":{"properties":{"kind":{"type":"string","enum":["basic","events","site_profile"],"title":"Kind"},"url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Url"}},"type":"object","required":["kind"],"title":"SiteCheckRequest"},"SiteChecksLatest":{"properties":{"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"basic":{"anyOf":[{"$ref":"#/components/schemas/SiteCheckOut"},{"type":"null"}]},"events":{"anyOf":[{"$ref":"#/components/schemas/SiteCheckOut"},{"type":"null"}]},"site_profile":{"anyOf":[{"$ref":"#/components/schemas/SiteCheckOut"},{"type":"null"}]}},"type":"object","required":["website_url","basic","events"],"title":"SiteChecksLatest"},"SlackLinkRequest":{"properties":{"slack_user_id":{"type":"string","title":"Slack User Id"},"slack_team_id":{"type":"string","title":"Slack Team Id"}},"type":"object","required":["slack_user_id","slack_team_id"],"title":"SlackLinkRequest"},"SlackLinkResponse":{"properties":{"status":{"type":"string","title":"Status"},"lapis_user_id":{"type":"integer","title":"Lapis User Id"},"lapis_email":{"type":"string","title":"Lapis Email"},"lapis_api_token":{"type":"string","title":"Lapis Api Token"},"token_expires_at":{"type":"string","title":"Token Expires At"}},"type":"object","required":["status","lapis_user_id","lapis_email","lapis_api_token","token_expires_at"],"title":"SlackLinkResponse"},"SlackRequest":{"properties":{"text":{"anyOf":[{"type":"string","maxLength":6000},{"type":"null"}],"title":"Text"},"step":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Step"},"data":{"additionalProperties":true,"type":"object","title":"Data"}},"type":"object","title":"SlackRequest"},"StripeInvoiceResponse":{"properties":{"id":{"type":"string","title":"Id"},"number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Number"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"amount_due":{"type":"integer","title":"Amount Due","default":0},"amount_paid":{"type":"integer","title":"Amount Paid","default":0},"created":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created"},"hosted_invoice_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hosted Invoice Url"},"invoice_pdf":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Pdf"}},"type":"object","required":["id"],"title":"StripeInvoiceResponse","description":"Safe invoice data for display in the app."},"StyleSchema":{"properties":{"id":{"type":"string","title":"Id","description":"Unique identifier (e.g., 'minimalist' or 'TPL_SEC03_FASH_042')"},"name":{"type":"string","title":"Name","description":"Display name (e.g., 'Minimalist')"},"description":{"type":"string","title":"Description","description":"Short description of the aesthetic"},"promptAddition":{"type":"string","title":"Promptaddition","description":"Personalized prompt text for image generation"},"template_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Id"},"style_family":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Style Family"},"archetype":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Archetype"},"channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel"},"aspect_ratio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aspect Ratio"},"objective":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Objective"},"copy_headline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Copy Headline"},"copy_cta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Copy Cta"}},"type":"object","required":["id","name","description","promptAddition"],"title":"StyleSchema","description":"A visual style for ad imagery."},"StylesResponse":{"properties":{"styles":{"items":{"$ref":"#/components/schemas/StyleSchema"},"type":"array","title":"Styles"},"source":{"type":"string","title":"Source","description":"Source of personalization: 'product_understanding', 'company_description', or 'generic'"},"memory":{"anyOf":[{"$ref":"#/components/schemas/ContextMemory"},{"type":"null"}]}},"type":"object","required":["styles","source"],"title":"StylesResponse","description":"Response containing personalized styles."},"SubmittedSourcesResponse":{"properties":{"submitted_sources":{"items":{"type":"string"},"type":"array","title":"Submitted Sources"}},"type":"object","required":["submitted_sources"],"title":"SubmittedSourcesResponse","description":"Response with list of page sources where user has submitted feedback."},"SubscriptionStatusResponse":{"properties":{"status":{"type":"string","title":"Status"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"stripe_customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Customer Id"},"subscription_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Start"},"subscription_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription End"},"next_renewal_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Renewal Date"},"monthly_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Credits"}},"type":"object","required":["status"],"title":"SubscriptionStatusResponse","description":"Normalized subscription status for the authenticated user."},"TargetAudienceSegmentResponse":{"properties":{"target_audience_summary":{"type":"string","title":"Target Audience Summary"},"target_audience_description":{"type":"string","title":"Target Audience Description"},"estimated_audience_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Estimated Audience Size"},"purchase_probability":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Purchase Probability"},"composite_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Composite Score"}},"type":"object","required":["target_audience_summary","target_audience_description"],"title":"TargetAudienceSegmentResponse","description":"Response schema for a target audience segment.\n\nAfter Step 2 (with scoring), segments include:\n- estimated_audience_size: Qualitative audience size (\"small\", \"medium\", \"large\")\n- purchase_probability: Likelihood of purchase (0.0-1.0)\n- composite_score: Combined ranking score"},"TeamMemberResponse":{"properties":{"id":{"type":"integer","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"},"invited_at":{"type":"string","format":"date-time","title":"Invited At"},"accepted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Accepted At"}},"type":"object","required":["id","email","role","status","invited_at"],"title":"TeamMemberResponse"},"TeamResponse":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"owner_user_id":{"type":"integer","title":"Owner User Id"},"owner_email":{"type":"string","title":"Owner Email"},"tier_name":{"type":"string","title":"Tier Name"},"seat_limit":{"type":"integer","title":"Seat Limit"},"seats_used":{"type":"integer","title":"Seats Used"}},"type":"object","required":["id","name","owner_user_id","owner_email","tier_name","seat_limit","seats_used"],"title":"TeamResponse"},"TemplatePopularity":{"properties":{"template_title":{"type":"string","title":"Template Title"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["template_title","count"],"title":"TemplatePopularity"},"ToggleChatGPTAdsRequest":{"properties":{"email":{"type":"string","title":"Email","description":"User email address"},"enabled":{"type":"boolean","title":"Enabled","description":"Enable or disable ChatGPT Ads","default":true},"account_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Id","description":"OpenAI Ads account ID (e.g. adacct_69d5a...). When provided, upserts a row in chatgpt_ads_client_accounts so the daily pipeline includes this account."},"client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Name","description":"Display name for the client (e.g. 'Italic', 'Gainful'). Used in report headers and emails. Defaults to user's company name."}},"type":"object","required":["email"],"title":"ToggleChatGPTAdsRequest"},"ToggleChatGPTAdsResponse":{"properties":{"status":{"type":"string","title":"Status"},"user_id":{"type":"integer","title":"User Id"},"user_email":{"type":"string","title":"User Email"},"chatgpt_ads_enabled":{"type":"boolean","title":"Chatgpt Ads Enabled"},"account_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Id"},"client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Name"}},"type":"object","required":["status","user_id","user_email","chatgpt_ads_enabled"],"title":"ToggleChatGPTAdsResponse"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In"}},"type":"object","required":["access_token","expires_in"],"title":"TokenResponse"},"ToolCallOutput":{"properties":{"name":{"type":"string","title":"Name","description":"Tool name"},"args":{"additionalProperties":true,"type":"object","title":"Args","description":"Tool arguments"},"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result","description":"Tool execution result"},"status":{"$ref":"#/components/schemas/ToolExecutionStatus","default":"success"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"type":"object","required":["name"],"title":"ToolCallOutput","description":"Output schema for a tool call made by the agent."},"ToolExecutionStatus":{"type":"string","enum":["pending","success","error"],"title":"ToolExecutionStatus","description":"Tool execution status values."},"UnratedImagesResponse":{"properties":{"images":{"items":{"$ref":"#/components/schemas/ReferenceAdImageRead"},"type":"array","title":"Images"},"total_unrated":{"type":"integer","title":"Total Unrated","description":"Total number of unrated images remaining"}},"type":"object","required":["images","total_unrated"],"title":"UnratedImagesResponse","description":"Response schema for unrated images endpoint."},"UpdateCollectionRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"}},"type":"object","title":"UpdateCollectionRequest","description":"Request to update a collection."},"UpdateKnowledgeBaseRequest":{"properties":{"content":{"type":"string","maxLength":50000,"title":"Content","description":"New full text for the knowledge base"},"edit_type":{"type":"string","enum":["add","edit","delete","bulk_update"],"title":"Edit Type","description":"Type of edit being made","default":"bulk_update"}},"type":"object","required":["content"],"title":"UpdateKnowledgeBaseRequest"},"UpdateTargetAudienceRequest":{"properties":{"target_audience_summary":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Target Audience Summary"},"target_audience_description":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}],"title":"Target Audience Description"},"estimated_audience_size":{"anyOf":[{"type":"string","enum":["small","medium","large"]},{"type":"null"}],"title":"Estimated Audience Size"},"purchase_probability":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Purchase Probability"}},"type":"object","title":"UpdateTargetAudienceRequest"},"UploadedImageInfo":{"properties":{"s3_url":{"type":"string","title":"S3 Url","description":"S3 URL of the uploaded image"},"display_order":{"type":"integer","title":"Display Order","description":"Display order of the image in the collection"},"format":{"type":"string","title":"Format","description":"Image format (png, jpg, etc.)"}},"type":"object","required":["s3_url","display_order","format"],"title":"UploadedImageInfo","description":"Information about a single uploaded image."},"UserDownloadStat":{"properties":{"user_id":{"type":"integer","title":"User Id"},"email":{"type":"string","title":"Email"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"is_pro":{"type":"boolean","title":"Is Pro"},"auto_count":{"type":"integer","title":"Auto Count"},"chat_count":{"type":"integer","title":"Chat Count"}},"type":"object","required":["user_id","email","company","is_pro","auto_count","chat_count"],"title":"UserDownloadStat"},"UserEngagementResponse":{"properties":{"rows":{"items":{"$ref":"#/components/schemas/UserEngagementRow"},"type":"array","title":"Rows"},"total_count":{"type":"integer","title":"Total Count"}},"type":"object","required":["rows","total_count"],"title":"UserEngagementResponse"},"UserEngagementRow":{"properties":{"user_id":{"type":"integer","title":"User Id"},"email":{"type":"string","title":"Email"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"is_pro":{"type":"boolean","title":"Is Pro"},"total_events":{"type":"integer","title":"Total Events"},"unique_actions":{"type":"integer","title":"Unique Actions"},"active_days":{"type":"integer","title":"Active Days"},"first_event":{"type":"string","format":"date-time","title":"First Event"},"last_event":{"type":"string","format":"date-time","title":"Last Event"}},"type":"object","required":["user_id","email","company","is_pro","total_events","unique_actions","active_days","first_event","last_event"],"title":"UserEngagementRow"},"UserEventCreate":{"properties":{"event_type":{"type":"string","title":"Event Type","description":"Type of event (e.g., 'ad_shared')"},"event_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Source","description":"Source of event (e.g., 'ads_agent')"},"event_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Event Metadata","description":"Additional event data"}},"type":"object","required":["event_type"],"title":"UserEventCreate","description":"Request schema for creating a user event."},"UserEventResponse":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"event_type":{"type":"string","title":"Event Type"},"event_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Source"},"event_metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Event Metadata"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","user_id","event_type","event_source","event_metadata","created_at"],"title":"UserEventResponse","description":"Response schema for a user event."},"UserGenerationStat":{"properties":{"user_id":{"type":"integer","title":"User Id"},"email":{"type":"string","title":"Email"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"is_pro":{"type":"boolean","title":"Is Pro"},"auto_count":{"type":"integer","title":"Auto Count"},"chat_count":{"type":"integer","title":"Chat Count"}},"type":"object","required":["user_id","email","company","is_pro","auto_count","chat_count"],"title":"UserGenerationStat"},"UserOwnAdsResponse":{"properties":{"page_name":{"type":"string","title":"Page Name"},"page_id":{"type":"string","title":"Page Id"},"facebook_url":{"type":"string","title":"Facebook Url"},"total_ads":{"type":"integer","title":"Total Ads"},"ads":{"items":{"$ref":"#/components/schemas/MetaAdResponse"},"type":"array","title":"Ads"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["page_name","page_id","facebook_url","total_ads","ads"],"title":"UserOwnAdsResponse","description":"Response for user's own Meta ads."},"UserRead":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"company_website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Website"},"company_short_desc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Short Desc"},"ad_primary_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ad Primary Language"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"is_active":{"type":"boolean","title":"Is Active"},"is_pro":{"type":"boolean","title":"Is Pro","default":true},"is_lite_enhanced":{"type":"boolean","title":"Is Lite Enhanced","default":false},"signup_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signup Country"},"timezone":{"type":"string","title":"Timezone"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_login":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login"},"lapis_goals":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Lapis Goals"},"appsumo_tier":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Appsumo Tier"},"appsumo_tier_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appsumo Tier Name"},"team_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Team Id"},"team_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Team Role"},"dashboard_walkthrough_completed":{"type":"boolean","title":"Dashboard Walkthrough Completed","default":false},"initial_ads_generated":{"type":"boolean","title":"Initial Ads Generated","default":false},"chatgpt_ads_enabled":{"type":"boolean","title":"Chatgpt Ads Enabled","default":false},"subscription_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Tier"},"subscription_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Status"},"free_downloads_used":{"type":"integer","title":"Free Downloads Used","default":0},"free_downloads_remaining":{"type":"integer","title":"Free Downloads Remaining","default":0},"signup_attribution":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Signup Attribution"},"community_available":{"type":"boolean","title":"Community Available","description":"True when the user's ad language has a community gallery feed.","readOnly":true}},"type":"object","required":["id","email","is_active","timezone","created_at","community_available"],"title":"UserRead"},"UserReferenceJudgementCreate":{"properties":{"is_liked":{"type":"boolean","title":"Is Liked","description":"True for like, False for dislike"}},"type":"object","required":["is_liked"],"title":"UserReferenceJudgementCreate","description":"Request schema for creating a judgement (like/dislike)."},"UserReferenceJudgementRead":{"properties":{"id":{"type":"integer","title":"Id"},"user_id":{"type":"integer","title":"User Id"},"reference_ad_image_id":{"type":"integer","title":"Reference Ad Image Id"},"is_liked":{"type":"boolean","title":"Is Liked"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","user_id","reference_ad_image_id","is_liked","created_at"],"title":"UserReferenceJudgementRead","description":"Response schema for a user judgement."},"UserUpdate":{"properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"company_website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Website"},"company_short_desc":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Company Short Desc"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"notification_preferences":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notification Preferences"},"ad_primary_language":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Ad Primary Language","description":"Primary language for ad generation"},"lapis_goals":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Lapis Goals","description":"User's selected goals from onboarding (e.g., ['ads', 'website', 'instagram', 'whatsapp'])"}},"type":"object","title":"UserUpdate"},"ValidateCompanyDescRequest":{"properties":{"company_short_desc":{"type":"string","title":"Company Short Desc"}},"type":"object","required":["company_short_desc"],"title":"ValidateCompanyDescRequest","description":"Request body for validating company description."},"ValidateCompanyDescResponse":{"properties":{"is_valid":{"type":"boolean","title":"Is Valid"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"flagged_categories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Flagged Categories"},"move_to_waitlist":{"type":"boolean","title":"Move To Waitlist","default":false}},"type":"object","required":["is_valid"],"title":"ValidateCompanyDescResponse","description":"Response after validating company description."},"ValidateNameRequest":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"ValidateNameRequest"},"ValidateNameResponse":{"properties":{"valid":{"type":"boolean","title":"Valid"},"blocked":{"type":"boolean","title":"Blocked","default":false},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["valid"],"title":"ValidateNameResponse"},"ValidateWebsiteRequest":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"ValidateWebsiteRequest"},"ValidateWebsiteResponse":{"properties":{"valid":{"type":"boolean","title":"Valid"},"blocked":{"type":"boolean","title":"Blocked","default":false},"status":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["valid"],"title":"ValidateWebsiteResponse"},"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"},"Values":{"properties":{"authorized":{"type":"boolean","title":"Authorized"},"pilotPeriodAccepted":{"type":"boolean","title":"Pilotperiodaccepted"},"pilotSpendAccepted":{"type":"boolean","title":"Pilotspendaccepted"},"effectiveDate":{"type":"string","title":"Effectivedate"},"companyName":{"type":"string","title":"Companyname"},"entityType":{"type":"string","title":"Entitytype"},"principalAddress":{"type":"string","title":"Principaladdress"},"signerName":{"type":"string","title":"Signername"},"signerEmail":{"type":"string","title":"Signeremail"},"signerTitle":{"type":"string","title":"Signertitle"},"minimumMonthlyCommitmentUsd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Minimummonthlycommitmentusd"},"signature":{"anyOf":[{"$ref":"#/components/schemas/Signature"},{"type":"null"}]}},"type":"object","required":["authorized","pilotPeriodAccepted","pilotSpendAccepted","effectiveDate","companyName","entityType","principalAddress","signerName","signerEmail","signerTitle"],"title":"Values","description":"BrandAuthorizationValues as posted by the dashboard contract modal."},"VerifyCodeRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"code":{"type":"string","maxLength":6,"minLength":6,"pattern":"^\\d{6}$","title":"Code"}},"type":"object","required":["email","code"],"title":"VerifyCodeRequest","description":"Request to verify a code."},"VerifyCodeResponse":{"properties":{"verified":{"type":"boolean","title":"Verified"},"message":{"type":"string","title":"Message"}},"type":"object","required":["verified","message"],"title":"VerifyCodeResponse","description":"Response after verifying a code."},"VerifyPhoneCodeRequest":{"properties":{"phone":{"type":"string","maxLength":15,"minLength":10,"title":"Phone","description":"Phone number (digits only)"},"code":{"type":"string","maxLength":6,"minLength":6,"pattern":"^\\d{6}$","title":"Code"},"country":{"type":"string","enum":["US","IN","CN","DE","JP","GB","FR","IT","BR","CA","MX","AU","KR","ES","ID","TR","NL","CH","AR","BE"],"title":"Country","description":"Country code for phone number formatting","default":"US"}},"type":"object","required":["phone","code"],"title":"VerifyPhoneCodeRequest","description":"Request to verify a phone verification code."},"VerifyPhoneCodeResponse":{"properties":{"verified":{"type":"boolean","title":"Verified"},"message":{"type":"string","title":"Message"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Generated email for use in complete-registration (user+{phone}@trylapis.com)"}},"type":"object","required":["verified","message"],"title":"VerifyPhoneCodeResponse","description":"Response after verifying a phone code."},"VerifyResetCodeRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"code":{"type":"string","maxLength":6,"minLength":6,"pattern":"^\\d{6}$","title":"Code"}},"type":"object","required":["email","code"],"title":"VerifyResetCodeRequest","description":"Request to verify a password reset code."},"VerifyResetCodeResponse":{"properties":{"verified":{"type":"boolean","title":"Verified"},"message":{"type":"string","title":"Message"},"reset_token":{"type":"string","title":"Reset Token","description":"Short-lived token for the final reset step"}},"type":"object","required":["verified","message","reset_token"],"title":"VerifyResetCodeResponse","description":"Response after verifying a password reset code."},"VibeKitSchema":{"properties":{"id":{"type":"integer","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"color_palette":{"items":{"type":"string"},"type":"array","title":"Color Palette"},"generated_images":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Generated Images"}},"type":"object","required":["id","name","slug","color_palette"],"title":"VibeKitSchema"},"VibeKitsResponse":{"properties":{"vibe_kits":{"items":{"$ref":"#/components/schemas/VibeKitSchema"},"type":"array","title":"Vibe Kits"}},"type":"object","required":["vibe_kits"],"title":"VibeKitsResponse"},"VisualDirectionSchema":{"properties":{"setting":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Setting"},"camera_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Camera Style"},"lighting":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lighting"},"wardrobe":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wardrobe"}},"type":"object","title":"VisualDirectionSchema","description":"Visual direction for a character persona."},"WaitlistRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"}},"type":"object","required":["email"],"title":"WaitlistRequest"},"WaitlistResponse":{"properties":{"id":{"type":"integer","title":"Id"},"email":{"type":"string","title":"Email"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"}},"type":"object","required":["id","email"],"title":"WaitlistResponse"},"WalkthroughStatusResponse":{"properties":{"completed":{"type":"boolean","title":"Completed","description":"Whether the dashboard walkthrough has been completed"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At","description":"When the walkthrough was completed"}},"type":"object","required":["completed"],"title":"WalkthroughStatusResponse","description":"Response model for walkthrough completion status."},"WebsiteMatchResponse":{"properties":{"website":{"type":"string","title":"Website"},"website_id":{"type":"string","title":"Website Id"},"matched_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Matched Name"},"confidence":{"type":"string","enum":["high","medium","low"],"title":"Confidence"},"confidence_score":{"type":"number","title":"Confidence Score"},"confidence_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confidence Reason"}},"type":"object","required":["website","website_id","confidence","confidence_score"],"title":"WebsiteMatchResponse"},"WorkspaceOutput":{"properties":{"images":{"items":{"$ref":"#/components/schemas/ImageOutput"},"type":"array","title":"Images","description":"All images in the workspace"},"session_primary_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Primary Image","description":"ID of the primary/active image for this session"}},"type":"object","title":"WorkspaceOutput","description":"Output schema for workspace state."},"_CompanyFactItem":{"properties":{"type":{"type":"string","title":"Type"},"value":{"type":"string","title":"Value"}},"type":"object","required":["type","value"],"title":"_CompanyFactItem","description":"A company fact entry."},"_ContextMemory":{"properties":{"product_understanding":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Understanding"},"company_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Description"},"company_facts":{"anyOf":[{"items":{"$ref":"#/components/schemas/_CompanyFactItem"},"type":"array"},{"type":"null"}],"title":"Company Facts"}},"type":"object","title":"_ContextMemory","description":"Context data used for personalization."},"_GenerateTemplatePromptRequest":{"properties":{"template_type":{"type":"string","title":"Template Type","description":"Template type (e.g., 'Product Showcase', 'Banner Ad')"},"orientation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orientation","description":"Image orientation: 'horizontal' (16:9) or 'vertical' (9:16). If not specified, generates a generic prompt."}},"type":"object","required":["template_type"],"title":"_GenerateTemplatePromptRequest","description":"Request to generate a personalized prompt for a specific template type."},"_GenerateTemplatePromptResponse":{"properties":{"template_type":{"type":"string","title":"Template Type"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"prompt":{"type":"string","title":"Prompt"},"source":{"type":"string","title":"Source"},"orientation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Orientation"},"memory":{"anyOf":[{"$ref":"#/components/schemas/_ContextMemory"},{"type":"null"}]}},"type":"object","required":["template_type","title","description","prompt","source"],"title":"_GenerateTemplatePromptResponse","description":"Response with the generated template prompt."},"app__api__endpoints__content_agent__ChipContext":{"properties":{"kind":{"type":"string","title":"Kind"},"label":{"type":"string","title":"Label"},"prompt_addition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt Addition"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"collection_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Collection Id"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"},"image_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Image Urls"},"vibe_kit_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Vibe Kit Id"},"vibe_kit_images":{"anyOf":[{"additionalProperties":{"additionalProperties":{"type":"string"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Vibe Kit Images"},"color_palette":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Color Palette"},"product_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Name"},"product_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Url"},"product_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Description"},"product_image_urls":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Product Image Urls"},"product_vendor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Vendor"},"product_price":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Price"}},"type":"object","required":["kind","label"],"title":"ChipContext","description":"A single chip selection from the frontend toolbar."},"app__schemas__image_agent_schemas__ChipContext":{"properties":{"id":{"type":"string","title":"Id"},"kind":{"type":"string","title":"Kind"},"label":{"type":"string","title":"Label"},"meta":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Meta"}},"type":"object","required":["id","kind","label"],"title":"ChipContext","description":"A single chip selection from the frontend ads studio."}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}