{"openapi":"3.1.0","info":{"title":"OtakuSolutions Homepage","description":"Official website for OtakuSolutions DCC tools","version":"1.0.0"},"paths":{"/":{"get":{"summary":"루트 (언어 자동 감지)","description":"루트 경로\n\n브라우저 언어를 자동 감지하여 적절한 언어 페이지로 리다이렉트","operationId":"root__get","responses":{"307":{"description":"Successful Response"}}}},"/{lang}/":{"get":{"summary":"메인 홈페이지 (다국어)","description":"메인 홈페이지 (다국어)\n\nOtakuSolutions 소개 + 제품 카드","operationId":"home__lang___get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/fast-ref/savings":{"get":{"summary":"Fast Ref savings calculator","description":"공개 계산기. 입력은 저장하지 않는다.","operationId":"fast_ref_savings__lang__fast_ref_savings_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/fast-ref":{"get":{"summary":"Fast Ref 제품 페이지 (다국어)","description":"Fast Ref 제품 상세 페이지 (다국어)","operationId":"fast_ref__lang__fast_ref_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/biped-plus/hierarchy":{"get":{"summary":"BipedPlus hierarchy reference","description":"로그인 없이 여는 계층 미리보기. 씬은 정적 JSON이다.","operationId":"biped_plus_hierarchy__lang__biped_plus_hierarchy_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/biped-plus":{"get":{"summary":"BipedPlus 제품 페이지","description":"BipedPlus 제품 상세 페이지 (전용 템플릿)","operationId":"biped_plus__lang__biped_plus_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/motion-hub":{"get":{"summary":"MotionHub dummy product page","operationId":"motion_hub__lang__motion_hub_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/skin-layer-studio":{"get":{"summary":"SkinLayer Studio 제품 페이지","description":"SkinLayer Studio 제품 상세 페이지 (전용 템플릿)","operationId":"skin_layer_studio__lang__skin_layer_studio_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/solution-bp":{"get":{"summary":"Solution: BP → BipedPlus 리다이렉트","description":"기존 solution-bp URL을 biped-plus로 리다이렉트","operationId":"solution_bp_redirect__lang__solution_bp_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"307":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/solution-sm":{"get":{"summary":"Solution: SM 제품 페이지","description":"Solution 제품 상세 페이지 (PM, SM 공용)","operationId":"solution_product_page__lang__solution_sm_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/solution-pm":{"get":{"summary":"Solution: PM 제품 페이지","description":"Solution 제품 상세 페이지 (PM, SM 공용)","operationId":"solution_product_page__lang__solution_pm_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/fast-ref-batch":{"get":{"summary":"Fast Ref Batch 제품 페이지","description":"Fast Ref Batch 제품 상세 페이지 (전용 템플릿)","operationId":"fast_ref_batch_page__lang__fast_ref_batch_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/debug-product":{"get":{"summary":"Debug Product 페이지 (admin 전용)","description":"Paddle 결제 프로세스 검증용 admin 전용 페이지.\nSandbox / Live 결제 버튼을 제공한다.","operationId":"debug_product_page__lang__debug_product_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health":{"get":{"summary":"헬스 체크","description":"서버 상태 체크","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/{lang}/about":{"get":{"summary":"About 페이지 (다국어)","description":"About 페이지 (다국어)\n\n팀 소개 및 미션","operationId":"about__lang__about_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/level":{"get":{"summary":"레벨제 안내 (다국어)","description":"누구나 읽는 레벨 설명. 로그인한 숫자는 /my-level 이다.","operationId":"level_guide__lang__level_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/settlers":{"get":{"summary":"The First Settlers 페이지 (다국어)","description":"The First Settlers 페이지 (다국어)\n\n파트너 보상 프로그램 소개","operationId":"settlers__lang__settlers_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/your-mission":{"get":{"summary":"Your Mission 페이지 (다국어)","description":"Your Mission 페이지 (다국어)\n\n사용자 피드백 가이드 - 펭귄 짤과 함께","operationId":"your_mission__lang__your_mission_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/work-guarantee":{"get":{"summary":"작업 보장제 페이지 (다국어)","description":"작업 보장제 페이지 (다국어)\n\nFast Ref 품질 보증 정책 - 해결 못 하면 환불","operationId":"work_guarantee__lang__work_guarantee_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/contact":{"get":{"summary":"Contact 페이지 (다국어)","description":"Contact 페이지 (다국어)\n\n문의 폼 및 이메일 정보","operationId":"contact__lang__contact_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/partnership":{"get":{"summary":"협업 제안 페이지 (다국어)","description":"협업 제안 페이지 (다국어)\n\n비즈니스/크리에이터/교육/기술 파트너십 제안","operationId":"partnership__lang__partnership_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/updates":{"get":{"summary":"Updates 페이지 (다국어)","description":"Updates 페이지 (다국어)\n\nnews_service (data/docs/updates/) 기반 렌더링","operationId":"updates__lang__updates_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/announcements":{"get":{"summary":"공지사항 페이지 (다국어)","description":"공지사항 페이지 (다국어)\n\nnews_service (data/docs/announcements/) 기반 렌더링","operationId":"announcements__lang__announcements_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/feature-request":{"get":{"summary":"기능 제안 페이지 (다국어)","description":"기능 제안 페이지 (다국어)\n\n새 기능/개선/버그 리포트 제안","operationId":"feature_request__lang__feature_request_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/version/{product_id}/latest":{"get":{"tags":["API"],"summary":"최신 버전 정보","description":"최신 버전 정보 조회\n\nArgs:\n    product_id: 제품 ID (예: fast-ref, tool-b, tool-c)\n\nReturns:\n    Dict: 버전 정보 또는 에러","operationId":"get_latest_version_api_version__product_id__latest_get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/version/{product_id}/refresh":{"post":{"tags":["API"],"summary":"버전 정보 강제 새로고침","description":"Google Drive에서 version.json 다시 다운로드\n\nArgs:\n    product_id: 제품 ID (예: fast-ref, tool-b, tool-c)\n\n관리자 툴에서 호출\n인증 불필요 (공개 데이터)\n\nReturns:\n    {\n        \"success\": true,\n        \"message\": \"버전 정보 업데이트 완료\",\n        \"product_id\": \"fast-ref\",\n        \"version\": \"1.0.0\",\n        \"release_date\": \"2025-11-17\",\n        \"updated_at\": \"2025-12-03 15:30:00\"\n    }","operationId":"refresh_version_api_version__product_id__refresh_post","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/contact":{"post":{"tags":["API"],"summary":"Contact 문의 전송","description":"Contact 페이지 문의 처리\n- 관리자: 텔레그램 알림 + 이메일 (첨부파일 포함)\n- 사용자: 확인 이메일 발송\n\nArgs:\n    from_email: 발신자 이메일\n    subject: 제목\n    message: 내용\n    lang: 언어\n    files: 첨부파일 (선택, 최대 3개)\n\nReturns:\n    {\n        \"success\": true,\n        \"message\": \"문의가 성공적으로 전송되었습니다.\"\n    }","operationId":"send_contact_inquiry_api_contact_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_send_contact_inquiry_api_contact_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/contact/connector":{"post":{"tags":["API"],"summary":"커넥터 상태 제보","description":"커넥터 Send. 사용자 이메일이 없으면 확인 메일을 보내지 않는다.","operationId":"send_connector_report_api_contact_connector_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_send_connector_report_api_contact_connector_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/partnership":{"post":{"tags":["API"],"summary":"협업 제안 전송","description":"협업 제안 처리\n- 관리자: 이메일 (첨부파일 포함) + 텔레그램 알림\n- 사용자: 접수 확인 이메일 발송\n\nArgs:\n    name: 이름/기업명\n    email: 이메일\n    phone: 연락처 (선택)\n    partner_type: 제안 유형 (business, creator, education, tech, other)\n    subject: 제목\n    message: 내용\n    portfolio_url: 포트폴리오 URL (선택)\n    privacy_agreed: 개인정보 동의\n    lang: 언어\n    files: 첨부파일 (선택)\n\nReturns:\n    {\n        \"success\": true,\n        \"message\": \"협업 제안이 성공적으로 전송되었습니다.\"\n    }","operationId":"submit_partnership_api_partnership_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_submit_partnership_api_partnership_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/feature-request":{"post":{"tags":["API"],"summary":"기능 제안 전송","description":"기능 제안 처리\n- 관리자: 텔레그램 알림 + 이메일 (첨부파일 포함)\n- 사용자: 접수 확인 이메일 발송\n\nArgs:\n    email: 이메일\n    product: 제품 (fast-ref, fast-ref-batch, etc)\n    request_type: 제안 유형 (new_feature, improvement, bug)\n    subject: 제목\n    message: 내용\n    lang: 언어\n    files: 첨부파일 (선택, 최대 3개)\n\nReturns:\n    {\n        \"success\": true,\n        \"message\": \"기능 제안이 성공적으로 전송되었습니다.\"\n    }","operationId":"submit_feature_request_api_feature_request_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_submit_feature_request_api_feature_request_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/token-benefits":{"get":{"tags":["API"],"summary":"토큰 혜택 정보 조회","description":"토큰 혜택 정보 조회 (캐시된 데이터 반환 - 서버 시작 시 1회 로드)\n\nReturns:\n    Dict: 각 토큰 타입별 혜택 정보\n    {\n        \"Gold\": \"혜택 내용...\",\n        \"Silver\": \"혜택 내용...\",\n        \"Copper\": \"혜택 내용...\"\n    }","operationId":"get_token_benefits_api_token_benefits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/fast-ref/savings-feedback":{"post":{"tags":["API"],"summary":"Fast Ref savings calculator feedback","description":"관리자 메일만 보낸다. 확인 메일은 보내지 않고 DB에도 남기지 않는다.","operationId":"savings_feedback_api_fast_ref_savings_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavingsFeedbackBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sitemap.xml":{"get":{"tags":["SEO"],"summary":"Sitemap","description":"Sitemap 생성\n\n검색 엔진이 사이트 구조를 이해하도록 도움","operationId":"sitemap_sitemap_xml_get","responses":{"200":{"description":"Successful Response"}}}},"/robots.txt":{"get":{"tags":["SEO"],"summary":"Robots","description":"robots.txt 생성\n\n검색 엔진 크롤러에게 크롤링 규칙 전달","operationId":"robots_robots_txt_get","responses":{"200":{"description":"Successful Response"}}}},"/{lang}/login":{"get":{"tags":["auth"],"summary":"Login Page","description":"로그인 페이지","operationId":"login_page__lang__login_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/register":{"get":{"tags":["auth"],"summary":"Register Page","description":"회원가입 페이지","operationId":"register_page__lang__register_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/forgot-password":{"get":{"tags":["auth"],"summary":"Forgot Password Page","description":"비밀번호 찾기 페이지","operationId":"forgot_password_page__lang__forgot_password_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/reset-password/{token}":{"get":{"tags":["auth"],"summary":"Reset Password Page","description":"비밀번호 재설정 페이지","operationId":"reset_password_page__lang__reset_password__token__get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/send-code":{"post":{"tags":["auth"],"summary":"Send Code","description":"인증 코드 발송 API (Step 1)","operationId":"send_code_auth_send_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/resend-code":{"post":{"tags":["auth"],"summary":"Resend Code","description":"인증 코드 재발송 API","operationId":"resend_code_auth_resend_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/verify-code":{"post":{"tags":["auth"],"summary":"Verify Code","description":"인증 코드 검증 API (Step 2)","operationId":"verify_code_auth_verify_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/register":{"post":{"tags":["auth"],"summary":"Register","description":"회원가입 API (Step 3 - 인증 완료 후)","operationId":"register_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"로그인 API","operationId":"login_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","description":"로그아웃 API","operationId":"logout_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/{lang}/logout":{"get":{"tags":["auth"],"summary":"Logout Get","description":"로그아웃 (GET 방식) - 비밀번호 변경 후 리다이렉트용","operationId":"logout_get__lang__logout_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/forgot-password":{"post":{"tags":["auth"],"summary":"Forgot Password","description":"비밀번호 찾기 API","operationId":"forgot_password_auth_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/reset-password/{token}":{"post":{"tags":["auth"],"summary":"Reset Password","description":"비밀번호 재설정 API","operationId":"reset_password_auth_reset_password__token__post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/settings":{"get":{"tags":["auth"],"summary":"Settings Page","description":"계정 설정 페이지","operationId":"settings_page__lang__settings_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/my-level":{"get":{"tags":["auth"],"summary":"My Level Page","description":"레벨·포인트. Reads users.level_points only.","operationId":"my_level_page__lang__my_level_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/update-profile":{"post":{"tags":["auth"],"summary":"Update Profile","description":"프로필 수정 API","operationId":"update_profile_auth_update_profile_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/marketing-preferences":{"patch":{"tags":["auth"],"summary":"Update Marketing Preferences","description":"마케팅 수신동의 변경 API (로그인 필수)","operationId":"update_marketing_preferences_auth_marketing_preferences_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingPreferencesRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/change-password":{"post":{"tags":["auth"],"summary":"Change Password","description":"비밀번호 변경 API","operationId":"change_password_auth_change_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/whoami":{"get":{"tags":["auth"],"summary":"Whoami","description":"세션 인트로스펙션 엔드포인트.\n\ndocs.otakusolutions.com 서버가 os_session 쿠키를 포워딩해서 호출.\nrequest.state.user 는 SessionMiddleware 가 이미 채워 놓음.\n본인 세션만 반환(쿠키 기반, 타인 조회 파라미터 없음).\n\n반환:\n    비로그인/만료: {\"authenticated\": false}\n    로그인:        {\"authenticated\": true, \"email\": ..., \"role\": ..., \"is_admin\": ...}","operationId":"whoami_api_auth_whoami_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/{lang}/buy/{product_id}":{"get":{"tags":["purchase"],"summary":"Buy Page","description":"구매 신청 페이지","operationId":"buy_page__lang__buy__product_id__get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/buy/{product_id}/complete":{"get":{"tags":["purchase"],"summary":"Buy Complete Page","description":"구매 신청 완료 페이지","operationId":"buy_complete_page__lang__buy__product_id__complete_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/trial/{product_id}":{"get":{"tags":["purchase"],"summary":"Trial Page","description":"체험 신청 페이지","operationId":"trial_page__lang__trial__product_id__get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/trial/{product_id}/complete":{"get":{"tags":["purchase"],"summary":"Trial Complete Page","description":"체험 신청 완료 페이지","operationId":"trial_complete_page__lang__trial__product_id__complete_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/purchase/request":{"post":{"tags":["purchase"],"summary":"Create Purchase Request","description":"구매 신청 API","operationId":"create_purchase_request_api_purchase_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseRequestModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/purchase/my-requests":{"get":{"tags":["purchase"],"summary":"Get My Requests","description":"내 구매 신청 목록 API","operationId":"get_my_requests_api_purchase_my_requests_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/purchase/notify-payment":{"post":{"tags":["purchase"],"summary":"Notify Payment","description":"입금 완료 알림 API - 관리자에게 이메일 발송","operationId":"notify_payment_api_purchase_notify_payment_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentNotificationModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/trial/request":{"post":{"tags":["purchase"],"summary":"Create Trial Request","description":"체험 신청 API - 자동 라이센스 발급 포함","operationId":"create_trial_request_api_trial_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrialRequestModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/player/{product_id}":{"get":{"tags":["purchase"],"summary":"Player Page","description":"애니메이터 에디션 신청 페이지","operationId":"player_page__lang__player__product_id__get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/player/{product_id}/complete":{"get":{"tags":["purchase"],"summary":"Player Complete Page","description":"애니메이터 에디션 신청 완료 페이지","operationId":"player_complete_page__lang__player__product_id__complete_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/player/request":{"post":{"tags":["purchase"],"summary":"Create Player Request","description":"애니메이터 에디션 신청 API - 자동 라이센스 발급 포함","operationId":"create_player_request_api_player_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlayerRequestModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/purchase/request-permanent":{"post":{"tags":["purchase"],"summary":"Request Permanent License","description":"사용자가 영구 라이센스 전환을 요청합니다.\n\n- 로그인 필요\n- split_3 상태인 분할결제 플랜이 있어야 합니다\n- status를 permanent_requested로 변경하고 관리자에게 Telegram 알림 발송","operationId":"request_permanent_license_api_purchase_request_permanent_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/{lang}/debug/paddle-live":{"get":{"tags":["paddle"],"summary":"Paddle Live Page","description":"Paddle LIVE 실결제 검증 페이지 — Fast_Ref (admin 전용) ⚠️ 실결제 발생","operationId":"paddle_live_page__lang__debug_paddle_live_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/debug/paddle-live-bp":{"get":{"tags":["paddle"],"summary":"Paddle Live Bp Page","description":"Paddle LIVE 실결제 검증 페이지 — BipedPlus $399 (admin 전용) ⚠️ 실결제 발생","operationId":"paddle_live_bp_page__lang__debug_paddle_live_bp_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/debug/paddle-live-fr-1":{"get":{"tags":["paddle"],"summary":"Paddle Live Fr 1 Page","description":"Paddle LIVE $1 결제 — Fast_Ref $1 (admin 전용) ⚠️ 실제 $1 과금 — 전체 결제 흐름 검증용","operationId":"paddle_live_fr_1_page__lang__debug_paddle_live_fr_1_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/debug/paddle-live-bp-1":{"get":{"tags":["paddle"],"summary":"Paddle Live Bp 1 Page","description":"Paddle LIVE $1 결제 — BipedPlus $1 (admin 전용) ⚠️ 실제 $1 과금 — 전체 결제 흐름 검증용","operationId":"paddle_live_bp_1_page__lang__debug_paddle_live_bp_1_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/fast-ref/basic/checkout":{"get":{"tags":["paddle"],"summary":"Fast Ref Basic Checkout Page","description":"Fast_Ref 정식 결제 페이지 ($95) — production view.\n\n260811_B2B_Checkout_Page B3 — 개인 구매는 1개 고정 (qty_locked).\n260812_B2B_Direct_Checkout M3 — 기업·팀은 ?mode=enterprise 로 이 페이지에 직행한다.","operationId":"fast_ref_basic_checkout_page__lang__fast_ref_basic_checkout_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/biped-plus/basic/checkout":{"get":{"tags":["paddle"],"summary":"Biped Plus Basic Checkout Page","description":"BipedPlus 정식 (Basic) 결제 페이지 ($399) — production view.\n\n260811_B2B_Checkout_Page B3 — 개인 구매는 1개 고정 (qty_locked).\n260812_B2B_Direct_Checkout M3 — 기업·팀은 ?mode=enterprise 로 이 페이지에 직행한다.","operationId":"biped_plus_basic_checkout_page__lang__biped_plus_basic_checkout_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/fast-ref/purchase/enterprise":{"get":{"tags":["paddle"],"summary":"Fast Ref Enterprise Page","description":"Fast_Ref 기업·팀 좌석 구매 — checkout?mode=enterprise 로 302","operationId":"fast_ref_enterprise_page__lang__fast_ref_purchase_enterprise_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/biped-plus/purchase/enterprise":{"get":{"tags":["paddle"],"summary":"Biped Plus Enterprise Page","description":"BipedPlus 기업·팀 좌석 구매 — checkout?mode=enterprise 로 302","operationId":"biped_plus_enterprise_page__lang__biped_plus_purchase_enterprise_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/biped-plus/early-access/checkout":{"get":{"tags":["paddle"],"summary":"Biped Plus Early Checkout Page","description":"[DEPRECATED — 260808 EA 종료] `/basic/checkout`로 리다이렉트.\n\nEA는 2026-08-07 종료, 정가($399) 전환 완료. 이 라우트는 과거 링크/북마크\n호환을 위해 남기고, 항상 basic checkout으로 보낸다 (M2 Q2=A).","operationId":"biped_plus_early_checkout_page__lang__biped_plus_early_access_checkout_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/pay":{"get":{"tags":["paddle"],"summary":"Paddle Invoice Pay Page","description":"Paddle invoice 결제 링크 착지 페이지 (공개 · 로그인 불필요).\n\nPaddle 대시보드의 Default payment link 대상 페이지.\n수동 인보이스의 'Pay now' 는 이 URL 에 `?_ptxn={transaction_id}` 를 붙여 보낸다.\nPaddle.js 를 로드하고 해당 transaction 으로 오버레이 체크아웃을 자동으로 연다.\n\nclient_token 은 Paddle.js 공개 토큰이므로 서버측에서 페이지에 주입해도 안전하다.\nLIVE 전용 (수동 인보이스는 항상 Live 환경).","operationId":"paddle_invoice_pay_page__lang__pay_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/paddle/webhook":{"post":{"tags":["paddle"],"summary":"Paddle Webhook Sandbox","description":"Paddle Sandbox Webhook 수신 엔드포인트\n\n처리 이벤트:\n- transaction.completed: 결제 완료 -> 라이센스 자동 발급\n- transaction.payment_failed: 결제 실패 로깅\n\n라이브 서버(PADDLE_SANDBOX_MODE=false)에서는 받기만 하고 처리하지 않는다.\n이 경로의 시크릿은 모드를 따라 라이브 값이 되므로 Paddle 샌드박스가 보낸 웹훅은\n항상 서명 실패 → 재전송 → 텔레그램 CRITICAL 이 10분마다 반복됐다 (2026-10-30).\n샌드박스 거래를 운영 라이선스로 처리하지 않는 것도 이 차단이 보장한다.","operationId":"paddle_webhook_sandbox_api_paddle_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/paddle/sandbox/webhook":{"post":{"tags":["paddle"],"summary":"Paddle Webhook Sandbox","description":"Paddle Sandbox Webhook 수신 엔드포인트\n\n처리 이벤트:\n- transaction.completed: 결제 완료 -> 라이센스 자동 발급\n- transaction.payment_failed: 결제 실패 로깅\n\n라이브 서버(PADDLE_SANDBOX_MODE=false)에서는 받기만 하고 처리하지 않는다.\n이 경로의 시크릿은 모드를 따라 라이브 값이 되므로 Paddle 샌드박스가 보낸 웹훅은\n항상 서명 실패 → 재전송 → 텔레그램 CRITICAL 이 10분마다 반복됐다 (2026-10-30).\n샌드박스 거래를 운영 라이선스로 처리하지 않는 것도 이 차단이 보장한다.","operationId":"paddle_webhook_sandbox_api_paddle_sandbox_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/paddle/webhook-live":{"post":{"tags":["paddle"],"summary":"Paddle Webhook Live","description":"Paddle LIVE Webhook 수신 엔드포인트 (실결제 전용)\n\n- PADDLE_LIVE_WEBHOOK_SECRET 으로 서명 검증\n- LIVE Price ID 매핑 사용\n- sandbox_mode=False 고정 (라이센스 태그/텔레그램 알림에 반영)\n- PADDLE_SANDBOX_MODE 환경변수와 무관하게 항상 Live 처리","operationId":"paddle_webhook_live_api_paddle_webhook_live_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/paddle/live/webhook":{"post":{"tags":["paddle"],"summary":"Paddle Webhook Live","description":"Paddle LIVE Webhook 수신 엔드포인트 (실결제 전용)\n\n- PADDLE_LIVE_WEBHOOK_SECRET 으로 서명 검증\n- LIVE Price ID 매핑 사용\n- sandbox_mode=False 고정 (라이센스 태그/텔레그램 알림에 반영)\n- PADDLE_SANDBOX_MODE 환경변수와 무관하게 항상 Live 처리","operationId":"paddle_webhook_live_api_paddle_live_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/paddle/config":{"get":{"tags":["paddle"],"summary":"Paddle Config","description":"Paddle 결제 설정 반환 (admin 전용)\n\nPaddle.js 초기화에 필요한 client_token과 price_id를 반환한다.\nadmin 계정이 아니면 403 반환.","operationId":"paddle_config_api_paddle_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/paddle/config-live":{"get":{"tags":["paddle"],"summary":"Paddle Config Live","description":"Paddle LIVE 결제 설정 반환 (로그인 유저 허용)\n\nPADDLE_SANDBOX_MODE 값과 무관하게 항상 LIVE 키를 반환한다.\nclient_token과 price_ids는 Paddle 공식 JS에서 사용하는 공개 토큰이므로\n로그인된 유저에게 반환해도 보안 위험이 없다.","operationId":"paddle_config_live_api_paddle_config_live_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/paddle/preview-discount":{"post":{"tags":["paddle"],"summary":"Paddle Preview Discount","description":"가격/부가세/쿠폰 할인 미리보기 (Paddle Pricing Preview API 호출)\n\ndiscount_code 가 없으면 쿠폰 없는 기본 가격(소계/부가세/합계)만 조회한다.\n체크아웃 최초 로드·국가 변경·수량 변경 시 기본 VAT 표시에 사용.\n\nBody:\n    { \"price_id\": \"pri_xxx\", \"quantity\": 1, \"discount_code\": \"GGEMMI10\" (선택, 빈 값 가능),\n      \"country_code\": \"KR\", \"env_mode\": \"live\" or \"sandbox\" }\n\nReturns:\n    success: bool,\n    valid_discount: bool,    # 코드가 Paddle 에 등록된 유효한 discount 인지 (무쿠폰이면 항상 False)\n    currency_code: str,\n    original_total: int,     # cents/원 단위\n    discounted_total: int,\n    discount_amount: int,\n    tax: int,                # 부가세 (cents/원)\n    tax_rate: str,           # 세율 문자열 (e.g. \"0.1\")\n    formatted_total: str,    # Paddle formatted 문자열\n    formatted_discount: str,\n    formatted_tax: str,      # Paddle formatted 부가세\n    formatted_subtotal: str  # Paddle formatted 소계","operationId":"paddle_preview_discount_api_paddle_preview_discount_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/debug/paddle-status":{"get":{"tags":["paddle"],"summary":"Paddle Debug Status","description":"Paddle 설정 및 Webhook 수신 상태 자가진단 (admin only)\n\n환경변수 누락/오타, webhook 마지막 수신 시각/결과를 한 눈에 확인.\nprice_id는 마지막 6자리만 노출 (보안).","operationId":"paddle_debug_status_api_debug_paddle_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/{lang}/biped-plus/personal/checkout":{"get":{"tags":["paddle"],"summary":"Biped Plus Personal Checkout Page","description":"zh WeChat 3-split page. ko/en/ja → simple split checkout.","operationId":"biped_plus_personal_checkout_page__lang__biped_plus_personal_checkout_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/biped-plus/split/checkout":{"get":{"tags":["paddle"],"summary":"Biped Plus Split Checkout Page","description":"ko/en/ja card 3-split page. zh → personal checkout (China copy stays there).","operationId":"biped_plus_split_checkout_page__lang__biped_plus_split_checkout_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/my-products":{"get":{"tags":["license"],"summary":"My Products Page","description":"내 제품 페이지 - 라이센스 보유 목록 (License DB 기반)","operationId":"my_products_page__lang__my_products_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/pending-orders":{"get":{"tags":["license"],"summary":"Pending Orders Page","description":"진행중인 제품들 페이지 - 구매 신청 중인 목록 (Purchase DB 기반)","operationId":"pending_orders_page__lang__pending_orders_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/download/{product_id}":{"get":{"tags":["license"],"summary":"Download Page","description":"다운로드 페이지 - 구매 완료 사용자만 접근 가능","operationId":"download_page__lang__download__product_id__get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/my-team-licenses":{"get":{"tags":["license"],"summary":"My Team Licenses Page","description":"내 팀 라이센스 페이지 - 팀 리더/관리자만 접근 가능.\n\n[구매형] | [구독형] 탭 (260805_Subscription License Management M2).\n두 데이터 소스(License DB / Subscription DB)는 서로 독립 — 한쪽이 503이어도\n다른 탭은 정상 렌더한다 (부분 실패 허용).","operationId":"my_team_licenses_page__lang__my_team_licenses_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/team-licenses/assign":{"post":{"tags":["license"],"summary":"Assign Team License","description":"라이센스 배정 API - license_key 기반","operationId":"assign_team_license_api_team_licenses_assign_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignLicenseModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/team-licenses/unassign":{"post":{"tags":["license"],"summary":"Unassign Team License","description":"라이센스 회수 API - license_key 기반","operationId":"unassign_team_license_api_team_licenses_unassign_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnassignLicenseModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/download/track":{"post":{"tags":["license"],"summary":"Track Download","description":"다운로드 추적 API - 텔레그램으로 관리자 알림","operationId":"track_download_api_download_track_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DownloadTrackModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/download/nutstore":{"post":{"tags":["license"],"summary":"Nutstore Download","description":"견과운 임시 다운로드 주소 발급 (약 1분 유효). 공유 링크·비밀번호는 내보내지 않는다.\n\n브라우저는 받은 url 로 이동해 견과운에서 직접 받는다 (Railway 트래픽 없음).\n다운로드 알림은 여기서 보낸다. /api/download/track 을 따로 부르지 않는다.","operationId":"nutstore_download_api_download_nutstore_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NutstoreDownloadModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/direct-download/version/{product_id}":{"get":{"tags":["license"],"summary":"Get Direct Version","description":"Railway Volume에서 version.json 읽기 (직접 다운로드용, 로그인 필수)","operationId":"get_direct_version_api_direct_download_version__product_id__get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/download/app-update":{"post":{"tags":["license"],"summary":"Track App Update","description":"인앱 업데이트를 시작할 때마다 관리자 텔레그램. 파일 전송과 별개다.","operationId":"track_app_update_api_download_app_update_post","parameters":[{"name":"X-License-Email","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-License-Email"}},{"name":"X-License-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-License-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppUpdatePingModel"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/files/{product_id}/{filename}":{"get":{"tags":["license"],"summary":"Serve File","description":"Railway Volume에서 파일 직접 서빙.\n\n브라우저 회원은 로그인 쿠키 + 다운로드 페이지와 같은 권한. MotionHub·SkinLayer Studio\n앱은 라이선스 이메일·키 헤더. 키는 URL에 넣지 않는다. Range 요청은 206 으로 잇는다.","operationId":"serve_file_files__product_id___filename__get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}},{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}},{"name":"X-License-Email","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-License-Email"}},{"name":"X-License-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-License-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/upload-to-volume":{"post":{"tags":["license"],"summary":"Upload To Volume","description":"관리자: Railway Volume에 파일 업로드\n\nAdmin Tool에서 릴리스 배포 시 호출됨.\nGoogle Drive와 동일한 파일을 Railway Volume에도 저장.","operationId":"upload_to_volume_admin_upload_to_volume_post","parameters":[{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_to_volume_admin_upload_to_volume_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/sync-volume-from-gdrive":{"post":{"tags":["license"],"summary":"Sync Volume From Gdrive","description":"관리자: GDrive latest → Railway Volume 동기화 (서버 pull).\n\nAdmin Tool 대용량 multipart 업로드 우회.\nproduct 예: skin-layer-studio","operationId":"sync_volume_from_gdrive_admin_sync_volume_from_gdrive_post","parameters":[{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_sync_volume_from_gdrive_admin_sync_volume_from_gdrive_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/debug-volume":{"get":{"tags":["license"],"summary":"Debug Volume Status","description":"관리자: Railway Volume 저장 상태 확인 (디버그용)\n\nAdmin Tool에서 Volume에 저장된 파일 목록을 확인할 때 사용.","operationId":"debug_volume_status_admin_debug_volume_get","parameters":[{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/paddle/license-count":{"get":{"tags":["license"],"summary":"Paddle License Count","description":"현재 로그인된 유저의 특정 제품 라이센스 보유 수량 반환\n\nGET /api/paddle/license-count?product_name=Fast_Ref","operationId":"paddle_license_count_api_paddle_license_count_get","parameters":[{"name":"product_name","in":"query","required":false,"schema":{"type":"string","default":"","title":"Product Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/early-access/personal":{"get":{"tags":["early_access"],"summary":"Early Access Personal Page","description":"개인 구매 신청 페이지 (로그인 필수) - product 파라미터로 제품 선택","operationId":"early_access_personal_page__lang__early_access_personal_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"product","in":"query","required":false,"schema":{"type":"string","default":"fast-ref","title":"Product"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/early-access/business":{"get":{"tags":["early_access"],"summary":"Early Access Business Page","description":"기업 구매 신청 페이지 (로그인 필수) - product 파라미터로 제품 선택","operationId":"early_access_business_page__lang__early_access_business_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"product","in":"query","required":false,"schema":{"type":"string","default":"fast-ref","title":"Product"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/early-access/complete":{"get":{"tags":["early_access"],"summary":"Early Access Complete Page","description":"신청 완료 페이지","operationId":"early_access_complete_page__lang__early_access_complete_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"order_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/early-access/active-codes":{"get":{"tags":["early_access"],"summary":"Get Active Codes","description":"활성 이벤트 코드 목록 조회 (모달용)","operationId":"get_active_codes_api_early_access_active_codes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/early-access/check-duplicate":{"post":{"tags":["early_access"],"summary":"Check Duplicate Order","description":"얼리엑세스 중복 신청 체크 API (로그인 필수)","operationId":"check_duplicate_order_api_early_access_check_duplicate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DuplicateCheckModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/early-access/personal":{"post":{"tags":["early_access"],"summary":"Create Personal Order Api","description":"개인 구매 신청 API - Google Drive 업로드 (로그인 필수, 세션 email 강제 적용)","operationId":"create_personal_order_api_api_early_access_personal_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_personal_order_api_api_early_access_personal_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/early-access/business":{"post":{"tags":["early_access"],"summary":"Create Business Order Api","description":"기업 구매 신청 API - Google Drive 업로드 (여러 파일 지원, 로그인 필수, 세션 email 강제 적용)","operationId":"create_business_order_api_api_early_access_business_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_business_order_api_api_early_access_business_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/toss/invoices":{"get":{"tags":["admin"],"summary":"Toss Invoices","description":"관리자 툴 인보이스 탭용 토스 결제 목록 (WEB-N-028). since/until = YYYY-MM-DD (KST, 최대 1년).\n\n승인된·취소된 주문만 (관리자 확인 결제 포함 — kind=check), paymentKey 없음.","operationId":"toss_invoices_admin_toss_invoices_get","parameters":[{"name":"since","in":"query","required":false,"schema":{"type":"string","default":"","title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"type":"string","default":"","title":"Until"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/toss/invoices/{order_id}.pdf":{"get":{"tags":["admin"],"summary":"Toss Invoice Pdf","description":"관리자 툴용 자체 인보이스 PDF (WEB-N-029 M5). 없으면 만든다 (메일 없음).","operationId":"toss_invoice_pdf_admin_toss_invoices__order_id__pdf_get","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}},{"name":"variant","in":"query","required":false,"schema":{"type":"string","default":"","title":"Variant"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/toss/receipts/backfill":{"post":{"tags":["admin"],"summary":"Toss Receipts Backfill","description":"승인·취소된 토스 주문 중 자체 인보이스가 없거나 드라이브에 없는 것을 채운다 (WEB-N-029 M2).\n\n메일은 보내지 않는다. 동기 실행 — 주문 수가 적다.","operationId":"toss_receipts_backfill_admin_toss_receipts_backfill_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/discount-codes":{"get":{"tags":["admin"],"summary":"Discount Codes List","description":"쿠폰번호 목록. all=1 이면 만료·보관 포함.","operationId":"discount_codes_list_admin_discount_codes_get","parameters":[{"name":"all","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"All"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Discount Codes Create","description":"새 쿠폰 — Paddle 에 만든다. body: code, description, percent, expires_at?, usage_limit?, restrict_to?,\npartner?, visibility?, notes?","operationId":"discount_codes_create_admin_discount_codes_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/discount-codes/sync":{"post":{"tags":["admin"],"summary":"Discount Codes Sync","description":"Paddle 에서 지금 동기화.","operationId":"discount_codes_sync_admin_discount_codes_sync_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/discount-codes/{code}":{"patch":{"tags":["admin"],"summary":"Discount Codes Update","description":"고치기. Paddle 값: description, percent, expires_at, usage_limit, restrict_to, status(active/archived).\n홈 메타: partner, visibility, notes.","operationId":"discount_codes_update_admin_discount_codes__code__patch","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/discount-codes/redemptions":{"get":{"tags":["admin"],"summary":"Discount Codes Redemptions","description":"사용 기록 (결제사 · 주문 · 이메일 · 금액). code 가 없으면 전체 최근순.","operationId":"discount_codes_redemptions_admin_discount_codes_redemptions_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":500,"title":"Limit"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/discount-codes/export.csv":{"get":{"tags":["admin"],"summary":"Discount Codes Export Csv","operationId":"discount_codes_export_csv_admin_discount_codes_export_csv_get","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/discount-codes/export-drive":{"post":{"tags":["admin"],"summary":"Discount Codes Export Drive","description":"목록 CSV 를 드라이브 exports/ 에 (같은 날은 덮어쓰기).","operationId":"discount_codes_export_drive_admin_discount_codes_export_drive_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/discount-codes/backup-drive":{"post":{"tags":["admin"],"summary":"Discount Codes Backup Drive","description":"DB 를 드라이브 latest/ · backup/ 에 지금 백업 (평소에는 하루 한 번 자동).","operationId":"discount_codes_backup_drive_admin_discount_codes_backup_drive_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/reload-purchase-db":{"post":{"tags":["admin"],"summary":"Reload Purchase Db","description":"구매신청 DB 새로고침 (Google Drive에서 다시 다운로드)\n\n관리자 툴에서 Google Drive 업로드 후 호출","operationId":"reload_purchase_db_admin_reload_purchase_db_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/reload-user-db":{"post":{"tags":["admin"],"summary":"Reload User Db","description":"회원 DB 새로고침 (Google Drive에서 다시 다운로드)","operationId":"reload_user_db_admin_reload_user_db_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/reload-beta-db":{"post":{"tags":["admin"],"summary":"Reload Beta Db","description":"베타테스터 신청 DB 새로고침 (Google Drive에서 다시 다운로드)","operationId":"reload_beta_db_admin_reload_beta_db_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/reload-token-benefits":{"post":{"tags":["admin"],"summary":"Reload Token Benefits","description":"🎁 토큰 혜택 캐시 새로고침 (Google Drive에서 다시 다운로드)\n\n관리자 툴에서 토큰 혜택 저장 후 호출\n\n호출 방법:\ncurl -X POST https://otakusolutions.com/admin/reload-token-benefits          -H \"X-Admin-Key: <ADMIN_API_KEY>\"","operationId":"reload_token_benefits_admin_reload_token_benefits_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/update-purchase-status":{"post":{"tags":["admin"],"summary":"Update Purchase Status","description":"라이센스 발급 시 구매신청 상태 업데이트\n\nAdmin Tool에서 라이센스 발급 후 호출하여 purchase 상태를 'confirmed'로 변경\n\nRequest body:\n{\n    \"email\": \"user@example.com\",\n    \"product_name\": \"Fast Ref\",\n    \"notes\": \"라이센스 발급 완료\"\n}","operationId":"update_purchase_status_admin_update_purchase_status_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/health":{"get":{"tags":["admin"],"summary":"Admin Health","description":"관리자 API 상태 확인","operationId":"admin_health_admin_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/refresh-news-index":{"post":{"tags":["admin"],"summary":"Refresh News Index","description":"뉴스(업데이트) 인덱스 재빌드\n\ndata/docs/updates/ 를 push 경로 밖에서 직접 수정했을 때 호출\n\n호출 방법:\ncurl -X POST https://otakusolutions.com/admin/refresh-news-index          -H \"X-Admin-Key: <ADMIN_API_KEY>\"","operationId":"refresh_news_index_admin_refresh_news_index_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/refresh-announcements-cache":{"post":{"tags":["admin"],"summary":"Refresh Announcements Cache","description":"공지사항 인덱스 재빌드\n\ndata/docs/announcements/ 를 push 경로 밖에서 직접 수정했을 때 호출\n\n호출 방법:\ncurl -X POST https://otakusolutions.com/admin/refresh-announcements-cache          -H \"X-Admin-Key: <ADMIN_API_KEY>\"","operationId":"refresh_announcements_cache_admin_refresh_announcements_cache_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/refresh-feedback":{"post":{"tags":["admin"],"summary":"Refresh Feedback","description":"피드백(및 공지·업데이트) 인메모리 인덱스 재빌드.\n\ndocs/feedback/ 를 직접 수정했거나 push 경로 밖에서 파일이 바뀐 경우\n강제로 다시 스캔하고 싶을 때 호출한다.\n\n호출 방법:\ncurl -X POST https://otakusolutions.com/admin/refresh-feedback \\\n     -H \"X-Admin-Key: <ADMIN_API_KEY>\"","operationId":"refresh_feedback_admin_refresh_feedback_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/marketing/recipients":{"get":{"tags":["admin"],"summary":"Marketing Recipients","description":"마케팅 이메일 수신동의 회원 목록 (발송 대상 미리보기)\n\n호출 방법:\ncurl https://otakusolutions.com/admin/marketing/recipients \\\n     -H \"X-Admin-Key: <ADMIN_API_KEY>\"","operationId":"marketing_recipients_admin_marketing_recipients_get","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/marketing/send-email":{"post":{"tags":["admin"],"summary":"Marketing Send Email","description":"마케팅 이메일 발송\n\nBody (JSON):\n{\n    \"subject\": \"이메일 제목\",\n    \"body\": \"이메일 본문\",\n    \"dry_run\": false,\n    \"test_mode\": false,\n    \"test_email\": \"me@example.com\"\n}\n\n호출 방법:\ncurl -X POST https://otakusolutions.com/admin/marketing/send-email \\\n     -H \"X-Admin-Key: <ADMIN_API_KEY>\" \\\n     -H \"Content-Type: application/json\" \\\n     -d '{\"subject\":\"제목\",\"body\":\"본문\",\"dry_run\":true}'","operationId":"marketing_send_email_admin_marketing_send_email_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/marketing/send-log":{"get":{"tags":["admin"],"summary":"Marketing Send Log","description":"최근 마케팅 이메일 발송 이력\n\n호출 방법:\ncurl https://otakusolutions.com/admin/marketing/send-log \\\n     -H \"X-Admin-Key: <ADMIN_API_KEY>\"","operationId":"marketing_send_log_admin_marketing_send_log_get","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/subscription/dunning-sweep":{"post":{"tags":["admin"],"summary":"Subscription Dunning Sweep","description":"Run the daily subscription expiry reminder sweep (D-7 / D-1).\n\n호출 방법:\ncurl -X POST https://otakusolutions.com/admin/subscription/dunning-sweep \\\n     -H \"X-Admin-Key: <ADMIN_API_KEY>\"","operationId":"subscription_dunning_sweep_admin_subscription_dunning_sweep_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/subscription/metrics":{"get":{"tags":["admin"],"summary":"Subscription Metrics","description":"Aggregate subscription metrics: active count, canceled count, estimated MRR.\n\n호출 방법:\ncurl https://otakusolutions.com/admin/subscription/metrics \\\n     -H \"X-Admin-Key: <ADMIN_API_KEY>\"","operationId":"subscription_metrics_admin_subscription_metrics_get","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/subscription/reconcile":{"post":{"tags":["admin"],"summary":"Subscription Reconcile","description":"Reconcile Paddle subscriptions with DB server (once-daily job to fix missed webhooks).\n\n호출 방법:\ncurl -X POST https://otakusolutions.com/admin/subscription/reconcile \\\n     -H \"X-Admin-Key: <ADMIN_API_KEY>\"","operationId":"subscription_reconcile_admin_subscription_reconcile_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/volume/summary":{"get":{"tags":["admin-volume"],"summary":"Volume Summary","description":"볼륨 루트 top-level 요약 (dir는 재귀 바이트 합).\n\n호출 방법:\ncurl https://otakusolutions.com/admin/volume/summary \\\n     -H \"X-Admin-Key: <ADMIN_API_KEY>\"","operationId":"volume_summary_admin_volume_summary_get","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/volume/list":{"get":{"tags":["admin-volume"],"summary":"Volume List","description":"특정 폴더를 파일 단위로 목록화 (depth 1~3, in_use 표시 포함).\n\n호출 방법:\ncurl \"https://otakusolutions.com/admin/volume/list?path=products/fast-ref&depth=1\" \\\n     -H \"X-Admin-Key: <ADMIN_API_KEY>\"","operationId":"volume_list_admin_volume_list_get","parameters":[{"name":"path","in":"query","required":false,"schema":{"type":"string","default":"","title":"Path"}},{"name":"depth","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Depth"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/volume/delete":{"post":{"tags":["admin-volume"],"summary":"Volume Delete","description":"paths에 담긴 상대경로들을 삭제한다. confirm=true 필수, in_use 파일은 force=true 필요.\n\n호출 방법:\ncurl -X POST https://otakusolutions.com/admin/volume/delete \\\n     -H \"X-Admin-Key: <ADMIN_API_KEY>\" -H \"Content-Type: application/json\" \\\n     -d '{\"paths\": [\"products/docs_old_123\"], \"confirm\": true}'","operationId":"volume_delete_admin_volume_delete_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/volume/cleanup-empty":{"post":{"tags":["admin-volume"],"summary":"Volume Cleanup Empty","description":"products/ 아래 legacy 잔재(allow-list)만 정리한다. dry_run=true(기본)는 조회만.\n\n호출 방법:\ncurl -X POST https://otakusolutions.com/admin/volume/cleanup-empty \\\n     -H \"X-Admin-Key: <ADMIN_API_KEY>\" -H \"Content-Type: application/json\" \\\n     -d '{\"dry_run\": true}'","operationId":"volume_cleanup_empty_admin_volume_cleanup_empty_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CleanupEmptyBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/volume/relocate-docs-old":{"post":{"tags":["admin-volume"],"summary":"Volume Relocate Docs Old","description":"products/docs_old_* 를 docs/_old/legacy/ 로 옮긴다. dry_run=true(기본)는 조회만.\n\n호출 방법:\ncurl -X POST https://otakusolutions.com/admin/volume/relocate-docs-old \\\n     -H \"X-Admin-Key: <ADMIN_API_KEY>\" -H \"Content-Type: application/json\" \\\n     -d '{\"dry_run\": true}'","operationId":"volume_relocate_docs_old_admin_volume_relocate_docs_old_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RelocateDocsOldBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/infra-resources":{"get":{"tags":["admin-infra-resources"],"summary":"Infra Resource List","operationId":"infra_resource_list_admin_infra_resources_get","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin-infra-resources"],"summary":"Infra Resource Save","operationId":"infra_resource_save_admin_infra_resources_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/infra-resources/{slug}/drive":{"post":{"tags":["admin-infra-resources"],"summary":"Infra Resource Drive","operationId":"infra_resource_drive_admin_infra_resources__slug__drive_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DriveBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/infra-resources/{slug}/visibility":{"post":{"tags":["admin-infra-resources"],"summary":"Infra Resource Visibility","operationId":"infra_resource_visibility_admin_infra_resources__slug__visibility_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisibilityBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/admin/mail-media":{"get":{"tags":["admin-mail-media"],"summary":"Mail Media Page","operationId":"mail_media_page__lang__admin_mail_media_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mail-media/list":{"get":{"tags":["admin-mail-media"],"summary":"Mail Media List","operationId":"mail_media_list_admin_mail_media_list_get","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mail-media/upload":{"post":{"tags":["admin-mail-media"],"summary":"Mail Media Upload","operationId":"mail_media_upload_admin_mail_media_upload_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_mail_media_upload_admin_mail_media_upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mail-media":{"delete":{"tags":["admin-mail-media"],"summary":"Mail Media Delete","operationId":"mail_media_delete_admin_mail_media_delete","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mail-media/youtube":{"post":{"tags":["admin-mail-media"],"summary":"Mail Media Youtube","operationId":"mail_media_youtube_admin_mail_media_youtube_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/legal/terms":{"get":{"tags":["Legal"],"summary":"Terms Page","description":"이용약관 페이지","operationId":"terms_page__lang__legal_terms_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/legal/terms-beta":{"get":{"tags":["Legal"],"summary":"Terms Beta Page","description":"이용약관 - 베타 프로그램 페이지","operationId":"terms_beta_page__lang__legal_terms_beta_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/legal/terms-trial":{"get":{"tags":["Legal"],"summary":"Terms Trial Page","description":"이용약관 - 체험판 페이지","operationId":"terms_trial_page__lang__legal_terms_trial_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/legal/privacy":{"get":{"tags":["Legal"],"summary":"Privacy Page","description":"개인정보처리방침 페이지","operationId":"privacy_page__lang__legal_privacy_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/legal/refund":{"get":{"tags":["Legal"],"summary":"Refund Page","description":"환불 정책 페이지","operationId":"refund_page__lang__legal_refund_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/notifications/subscribe":{"post":{"tags":["notification"],"summary":"Subscribe Notification","description":"알림 신청 API (비로그인 가능)\n\n- 이메일 필수\n- 이름/전화번호 선택\n- 중복 신청 방지 (동일 이메일 + 제품명)\n- 관리자 알림 이메일 발송\n- 사용자 확인 이메일 발송","operationId":"subscribe_notification_api_notifications_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/notifications":{"get":{"tags":["notification"],"summary":"Get Notifications","description":"관리자: 알림 신청 목록 조회","operationId":"get_notifications_admin_notifications_get","parameters":[{"name":"product_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Name"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/notifications/{subscription_id}/mark-sent":{"post":{"tags":["notification"],"summary":"Mark Notification Sent","description":"관리자: 알림 발송 완료 처리","operationId":"mark_notification_sent_admin_notifications__subscription_id__mark_sent_post","parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"integer","title":"Subscription Id"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/notifications/{subscription_id}":{"delete":{"tags":["notification"],"summary":"Delete Notification","description":"관리자: 알림 신청 삭제","operationId":"delete_notification_admin_notifications__subscription_id__delete","parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"integer","title":"Subscription Id"}},{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/reload-notification-db":{"post":{"tags":["notification"],"summary":"Reload Notification Db","description":"알림 신청 DB 새로고침 (Google Drive에서 다시 다운로드)\n\n관리자 툴에서 Google Drive 업로드 후 호출","operationId":"reload_notification_db_admin_reload_notification_db_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/fast-ref/beta-team":{"get":{"tags":["beta"],"summary":"Beta Team Apply Page","description":"베타팀 신청 폼 페이지 (로그인 필수)","operationId":"beta_team_apply_page__lang__fast_ref_beta_team_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/fast-ref/beta-team/complete":{"get":{"tags":["beta"],"summary":"Beta Team Complete Page","description":"베타팀 신청 완료 페이지","operationId":"beta_team_complete_page__lang__fast_ref_beta_team_complete_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/biped-plus/beta-team":{"get":{"tags":["beta"],"summary":"Biped Plus Beta Team Apply Page","description":"BipedPlus 베타팀 신청 폼 페이지 (로그인 필수)","operationId":"biped_plus_beta_team_apply_page__lang__biped_plus_beta_team_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/biped-plus/beta-team/complete":{"get":{"tags":["beta"],"summary":"Biped Plus Beta Team Complete Page","description":"BipedPlus 베타팀 신청 완료 페이지","operationId":"biped_plus_beta_team_complete_page__lang__biped_plus_beta_team_complete_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/beta-team/apply":{"post":{"tags":["beta"],"summary":"Apply Beta Team","description":"베타팀 신청 API - 이메일 발송 (로그인 필수)","operationId":"apply_beta_team_api_beta_team_apply_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BetaTeamApplyModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/biped-plus/beta-personal":{"get":{"tags":["beta"],"summary":"Biped Plus Beta Personal Page","description":"BipedPlus 개인 베타 신청 폼 페이지 (로그인 필수)","operationId":"biped_plus_beta_personal_page__lang__biped_plus_beta_personal_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/biped-plus/beta-personal/complete":{"get":{"tags":["beta"],"summary":"Biped Plus Beta Personal Complete Page","description":"BipedPlus 개인 베타 신청 완료 페이지","operationId":"biped_plus_beta_personal_complete_page__lang__biped_plus_beta_personal_complete_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/skin-layer-studio/beta-personal":{"get":{"tags":["beta"],"summary":"Skin Layer Studio Beta Personal Page","description":"SkinLayer Studio 개인 베타 신청 폼 페이지 (로그인 필수)","operationId":"skin_layer_studio_beta_personal_page__lang__skin_layer_studio_beta_personal_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/skin-layer-studio/beta-personal/complete":{"get":{"tags":["beta"],"summary":"Skin Layer Studio Beta Personal Complete Page","description":"SkinLayer Studio 개인 베타 신청 완료 페이지","operationId":"skin_layer_studio_beta_personal_complete_page__lang__skin_layer_studio_beta_personal_complete_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/beta-personal/apply":{"post":{"tags":["beta"],"summary":"Apply Beta Personal","description":"개인 베타 신청 API","operationId":"apply_beta_personal_api_beta_personal_apply_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BetaPersonalApplyModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/feedback":{"get":{"tags":["feedback"],"summary":"Feedback List Page","description":"피드백 목록 페이지","operationId":"feedback_list_page__lang__feedback_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"product","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"scope","in":"query","required":false,"schema":{"type":"string","default":"title","title":"Scope"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/feedback/new":{"get":{"tags":["feedback"],"summary":"Feedback New Page","description":"피드백 작성 페이지 (로그인 필수)","operationId":"feedback_new_page__lang__feedback_new_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/feedback/{feedback_id}":{"get":{"tags":["feedback"],"summary":"Feedback Detail Page","description":"피드백 상세 페이지","operationId":"feedback_detail_page__lang__feedback__feedback_id__get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"feedback_id","in":"path","required":true,"schema":{"type":"string","title":"Feedback Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/feedback/{feedback_id}/edit":{"get":{"tags":["feedback"],"summary":"Feedback Edit Page","description":"피드백 수정 페이지 (본인만)","operationId":"feedback_edit_page__lang__feedback__feedback_id__edit_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"feedback_id","in":"path","required":true,"schema":{"type":"string","title":"Feedback Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/feedback":{"post":{"tags":["feedback"],"summary":"Create Feedback","description":"피드백 작성 API (마크다운 파일 기반, 이미지 첨부 지원)","operationId":"create_feedback_api_feedback_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_feedback_api_feedback_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/feedback/{feedback_id}":{"put":{"tags":["feedback"],"summary":"Update Feedback","description":"피드백 수정 API (본인 글만)","operationId":"update_feedback_api_feedback__feedback_id__put","parameters":[{"name":"feedback_id","in":"path","required":true,"schema":{"type":"string","title":"Feedback Id"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_update_feedback_api_feedback__feedback_id__put"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["feedback"],"summary":"Delete Feedback","description":"피드백 삭제 API (soft delete: published = false)","operationId":"delete_feedback_api_feedback__feedback_id__delete","parameters":[{"name":"feedback_id","in":"path","required":true,"schema":{"type":"string","title":"Feedback Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/feedback/{feedback_id}/moderate":{"patch":{"tags":["feedback"],"summary":"Moderate Feedback","description":"관리자 전용: 피드백 status 변경 + 답변 갱신 (현재 URL 언어로 lang_slot 적용)","operationId":"moderate_feedback_api_feedback__feedback_id__moderate_patch","parameters":[{"name":"feedback_id","in":"path","required":true,"schema":{"type":"string","title":"Feedback Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModerateFeedbackRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/feedback/{feedback_id}/notify-author-reply":{"post":{"tags":["feedback"],"summary":"Notify Author Reply","description":"관리자 전용: 피드백 작성자에게 답변 알림 이메일 발송","operationId":"notify_author_reply_api_feedback__feedback_id__notify_author_reply_post","parameters":[{"name":"feedback_id","in":"path","required":true,"schema":{"type":"string","title":"Feedback Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/telegram/webhook":{"post":{"tags":["telegram"],"summary":"Telegram Webhook","description":"Telegram Webhook 수신\n- 즉시 200 반환 → Telegram 재시도(retry) 방지\n- 실제 명령어 처리는 BackgroundTask로 실행\n- 관리자 Chat ID만 명령어 처리\n- 채팅 ID는 비밀이 아니다 → setWebhook secret_token 헤더가 맞아야 받는다","operationId":"telegram_webhook_api_telegram_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/analytics/daily-stats":{"get":{"tags":["analytics"],"summary":"Get Daily Stats","description":"daily_stats 테이블에서 날짜 범위 데이터 조회\n\nAdmin Tool의 Analytics 탭에서 사용","operationId":"get_daily_stats_api_analytics_daily_stats_get","parameters":[{"name":"start_date","in":"query","required":true,"schema":{"type":"string","description":"시작 날짜 (yyyy-MM-dd)","title":"Start Date"},"description":"시작 날짜 (yyyy-MM-dd)"},{"name":"end_date","in":"query","required":true,"schema":{"type":"string","description":"종료 날짜 (yyyy-MM-dd)","title":"End Date"},"description":"종료 날짜 (yyyy-MM-dd)"},{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analytics/today":{"get":{"tags":["analytics"],"summary":"Get Today Summary","description":"오늘 날짜의 page_views를 실시간 집계하여 요약 반환","operationId":"get_today_summary_api_analytics_today_get","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analytics/page-views":{"get":{"tags":["analytics"],"summary":"Get Page Views","description":"page_views 원본 (KST 하루, 최신순). 한 응답은 최대 500건.\n\nAdmin Tool '실시간 접속기록'이 offset 을 올려 그 날짜 00:00–24:00 을 모두 읽는다.","operationId":"get_page_views_api_analytics_page_views_get","parameters":[{"name":"date","in":"query","required":false,"schema":{"type":"string","description":"조회 날짜 (yyyy-MM-dd), 미지정 시 오늘","title":"Date"},"description":"조회 날짜 (yyyy-MM-dd), 미지정 시 오늘"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","description":"이번 응답 최대 건수","default":500,"title":"Limit"},"description":"이번 응답 최대 건수"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"건너뛸 건수. 하루가 500건을 넘으면 이어서 조회","default":0,"title":"Offset"},"description":"건너뛸 건수. 하루가 500건을 넘으면 이어서 조회"},{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analytics/aggregate":{"post":{"tags":["analytics"],"summary":"Trigger Aggregate","description":"page_views → daily_stats 수동 집계\n\nAdmin Tool의 '실시간 접속기록 → 일자 데이터로 넣기' 버튼에서 사용","operationId":"trigger_aggregate_api_analytics_aggregate_post","parameters":[{"name":"date","in":"query","required":false,"schema":{"type":"string","description":"집계 대상 날짜 (yyyy-MM-dd), 미지정 시 오늘","title":"Date"},"description":"집계 대상 날짜 (yyyy-MM-dd), 미지정 시 오늘"},{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analytics/run-daily-report":{"post":{"tags":["analytics"],"summary":"Trigger Run Daily Report","description":"자정 스케줄러와 동일한 프로세스를 수동 실행 (디버그용)\n\n프로세스:\n1. page_views → daily_stats 집계\n2. 텔레그램 보고서 발송\n3. Google Drive 백업\n4. 오래된 page_views 정리","operationId":"trigger_run_daily_report_api_analytics_run_daily_report_post","parameters":[{"name":"date","in":"query","required":false,"schema":{"type":"string","description":"보고서 대상 날짜 (yyyy-MM-dd), 미지정 시 오늘(KST)","title":"Date"},"description":"보고서 대상 날짜 (yyyy-MM-dd), 미지정 시 오늘(KST)"},{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/analytics/watch":{"get":{"tags":["analytics"],"summary":"Get Watch","description":"page_views 요약·구성과 access_events 집계를 한 번에 준다. 이메일·IP·키·방문자 해시는 없다.","operationId":"get_watch_api_analytics_watch_get","parameters":[{"name":"date","in":"query","required":false,"schema":{"type":"string","description":"조회 날짜 (yyyy-MM-dd), 미지정 시 오늘","title":"Date"},"description":"조회 날짜 (yyyy-MM-dd), 미지정 시 오늘"},{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}},{"name":"x-watch-key","in":"header","required":false,"schema":{"type":"string","title":"X-Watch-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/coupons/create":{"post":{"tags":["coupons"],"summary":"Admin Create Coupon","description":"쿠폰 발급 (관리자 전용)","operationId":"admin_create_coupon_admin_coupons_create_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/coupons/list":{"get":{"tags":["coupons"],"summary":"Admin List Coupons","description":"쿠폰 전체 목록 조회 (관리자 전용)","operationId":"admin_list_coupons_admin_coupons_list_get","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/reload-coupon-db":{"post":{"tags":["coupons"],"summary":"Admin Reload Coupon Db","description":"쿠폰 DB Google Drive 새로고침 (관리자 전용)","operationId":"admin_reload_coupon_db_admin_reload_coupon_db_post","parameters":[{"name":"x-admin-key","in":"header","required":false,"schema":{"type":"string","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/coupons/my":{"get":{"tags":["coupons"],"summary":"My Coupons","description":"내 쿠폰 목록 조회 (로그인 필요)","operationId":"my_coupons_api_coupons_my_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/coupons/validate":{"post":{"tags":["coupons"],"summary":"Validate Coupon","description":"쿠폰 유효성 검증 (로그인 필요)","operationId":"validate_coupon_api_coupons_validate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/coupons/use":{"post":{"tags":["coupons"],"summary":"Use Coupon","description":"쿠폰 사용 처리 (로그인 필요)","operationId":"use_coupon_api_coupons_use_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/unsubscribe/email/{token}":{"get":{"tags":["unsubscribe"],"summary":"Unsubscribe Email","description":"이메일 마케팅 수신거부","operationId":"unsubscribe_email_unsubscribe_email__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/unsubscribe/sms/{token}":{"get":{"tags":["unsubscribe"],"summary":"Unsubscribe Sms","description":"SMS 마케팅 수신거부","operationId":"unsubscribe_sms_unsubscribe_sms__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/unsubscribe/all/{token}":{"get":{"tags":["unsubscribe"],"summary":"Unsubscribe All","description":"이메일 + SMS 전체 수신거부","operationId":"unsubscribe_all_unsubscribe_all__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/preferences/{token}":{"get":{"tags":["unsubscribe"],"summary":"Preferences Page","description":"수신 설정 토글 페이지 (로그인 없이)","operationId":"preferences_page_preferences__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["unsubscribe"],"summary":"Preferences Save","description":"수신 설정 저장 (AJAX POST)","operationId":"preferences_save_preferences__token__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"}}}}}}},"/{lang}/partner/performance":{"get":{"summary":"Partner Performance Page","description":"파트너 전용 성과 대시보드 (role='partner' 필수)","operationId":"partner_performance_page__lang__partner_performance_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/content/push":{"post":{"summary":"콘텐츠 zip push (관리자 전용)","description":"zip 번들을 수신해 docs/ 볼륨을 원자적으로 교체한다.\n\n- 인증: X-Admin-Key == ServerConfig.ADMIN_API_KEY\n- zip 루트: docs/{announcements|updates|guide}/...\n- 성공: 200 {\"valid_slugs\": [...], \"warnings\": [...]}\n\n전송 방식 2가지 모두 허용:\n  1. multipart/form-data  field name \"file\"  (Cloudflare 우회 가능)\n  2. raw bytes  Content-Type: application/zip  (내부 네트워크 전용)","operationId":"content_push_api_content_push_post","parameters":[{"name":"X-Admin-Key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Admin-Key"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_content_push_api_content_push_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/content/export":{"get":{"summary":"콘텐츠 zip 다운로드 (관리자 전용)","description":"docs/{type}/** 를 zip으로 내려준다 (push와 대칭).\n\n- 인증: X-Admin-Key == ServerConfig.ADMIN_API_KEY (push와 동일 키)\n- type 화이트리스트만 허용 (임의 경로 탐색 차단)\n- 성공: 200, application/zip","operationId":"content_export_api_content_export_get","parameters":[{"name":"type","in":"query","required":true,"schema":{"type":"string","description":"announcements | updates | feedback | guide","title":"Type"},"description":"announcements | updates | feedback | guide"},{"name":"X-Admin-Key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/content/sync":{"get":{"summary":"콘텐츠 sync 스탬프 (관리자 전용)","description":"docs/{type}/_sync.json 또는 볼륨 해시(inferred).\ntype=guide 는 400 — 가이드 SSOT 는 docs Railway.","operationId":"content_sync_api_content_sync_get","parameters":[{"name":"type","in":"query","required":true,"schema":{"type":"string","description":"announcements | updates | feedback","title":"Type"},"description":"announcements | updates | feedback"},{"name":"X-Admin-Key","in":"header","required":false,"schema":{"type":"string","default":"","title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/paddle/subscription/sandbox/webhook":{"post":{"tags":["subscription"],"summary":"Subscription Webhook Sandbox","description":"구독 Sandbox Webhook (sandbox 전용 시크릿 사용).\n\n라이브 서버(PADDLE_SANDBOX_MODE=false)에서는 받기만 하고 처리하지 않는다 — 시크릿이 모드를 따라\n라이브 값이 되어 샌드박스 웹훅은 항상 서명 실패·CRITICAL 반복이었다 (2026-10-30, routes_paddle 과 같음).","operationId":"subscription_webhook_sandbox_api_paddle_subscription_sandbox_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/paddle/subscription/live/webhook":{"post":{"tags":["subscription"],"summary":"Subscription Webhook Live","description":"구독 LIVE Webhook (전용 LIVE 시크릿 사용, SANDBOX_MODE 무관).","operationId":"subscription_webhook_live_api_paddle_subscription_live_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/paddle/subscription/status":{"get":{"tags":["subscription"],"summary":"Subscription Webhook Status","description":"구독 Webhook 마지막 수신 상태 (Admin 디버그용).","operationId":"subscription_webhook_status_api_paddle_subscription_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/subscription/trial/request":{"post":{"tags":["subscription"],"summary":"Create Sls Trial Request","description":"SLS 체험 신청 API — subscriptions에 14일 trialing 발급 (260814: 로그인 회원 전원).","operationId":"create_sls_trial_request_api_subscription_trial_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrialRequestModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/subscription/dummy-grant":{"post":{"tags":["subscription"],"summary":"Create Mh Dummy Grant","description":"Issue MotionHub trial/subscribe via /admin/subscriptions/create.","operationId":"create_mh_dummy_grant_api_subscription_dummy_grant_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DummyGrantModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/motion-hub/purchase/trial":{"get":{"tags":["subscription"],"summary":"Mh Trial Form Page","operationId":"mh_trial_form_page__lang__motion_hub_purchase_trial_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/motion-hub/purchase/trial/complete":{"get":{"tags":["subscription"],"summary":"Mh Trial Complete Page","operationId":"mh_trial_complete_page__lang__motion_hub_purchase_trial_complete_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/motion-hub/purchase/subscribe":{"get":{"tags":["subscription"],"summary":"Mh Subscribe Page","operationId":"mh_subscribe_page__lang__motion_hub_purchase_subscribe_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/motion-hub/purchase/subscribe/complete":{"get":{"tags":["subscription"],"summary":"Mh Subscribe Complete Page","operationId":"mh_subscribe_complete_page__lang__motion_hub_purchase_subscribe_complete_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/skin-layer-studio/purchase":{"get":{"tags":["subscription"],"summary":"Sls Term Purchase Page","description":"SLS 선불 기간권 선택 UI. 로그인 회원 전원 공개 (260814) — guest는 login?next.","operationId":"sls_term_purchase_page__lang__skin_layer_studio_purchase_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/skin-layer-studio/purchase/enterprise":{"get":{"tags":["subscription"],"summary":"Sls Enterprise Purchase Page","description":"SLS 기업·팀 좌석 구매 — checkout?mode=add_seats 로 302.\n\n260811_B2B_Checkout_Page B6 에서 전용 페이지로 분리했지만,\n260812_B2B_Direct_Checkout M4 에서 좌석추가/연장 UI를 checkout 안으로 옮겼다.\n북마크 호환을 위해 URL 만 유지한다 (260814: admin 게이트 → 로그인 게이트).","operationId":"sls_enterprise_purchase_page__lang__skin_layer_studio_purchase_enterprise_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/skin-layer-studio/purchase/trial":{"get":{"tags":["subscription"],"summary":"Sls Trial Form Page","description":"SLS 14일 체험 신청 폼. 로그인 회원 전원 공개 (260814).\n\n260815: 계정당 1회 한정 — 구독 이력이 있으면 폼 대신 안내 카드를 렌더한다.\n자격 판정이 조회한 행을 그대로 배너에도 쓴다 (구독 DB 왕복 1회).","operationId":"sls_trial_form_page__lang__skin_layer_studio_purchase_trial_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/skin-layer-studio/purchase/trial/complete":{"get":{"tags":["subscription"],"summary":"Sls Trial Complete Page","description":"SLS 체험 신청 완료 페이지. 로그인 회원 전원 공개 (260814).","operationId":"sls_trial_complete_page__lang__skin_layer_studio_purchase_trial_complete_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/skin-layer-studio/purchase/checkout":{"get":{"tags":["subscription"],"summary":"Sls Term Checkout","description":"SLS 선불 기간권 one-time checkout. 로그인 회원 전원 공개 (260814).\n\n?sku=1m|12m — 그 외 값/미설정 price는 400 (기본값 폴백 금지, Fail Fast).\ntest_1usd 는 admin E2E 전용이라 비admin 에게는 400 이다.\n기존 BP Early Access 패턴과 동일하게 purchase/paddle-checkout.html 을 재사용한다.","operationId":"sls_term_checkout__lang__skin_layer_studio_purchase_checkout_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/paddle/subscription-payment-status":{"get":{"tags":["subscription"],"summary":"Paddle Subscription Payment Status","description":"SLS 선불 기간권 결제가 구독 DB에 기록됐는지 확인 (checkout 성공 화면 폴링용).\n\nGET /api/paddle/subscription-payment-status?product_name=SkinLayerStudio&txn_id=txn_...\n\n260808 — 구독형 결제는 licenses 스토어를 건드리지 않으므로\n`/api/paddle/license-count` 폴링으로는 절대 감지되지 않아 checkout이 항상\n\"발급 지연\" 오탐을 냈다. `paddle-checkout.html`이 SLS term 모드(sls_checkout)일\n때는 이 API(구독 DB의 subscription_payments 조회)로 폴링한다.","operationId":"paddle_subscription_payment_status_api_paddle_subscription_payment_status_get","parameters":[{"name":"product_name","in":"query","required":false,"schema":{"type":"string","default":"","title":"Product Name"}},{"name":"txn_id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Txn Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/skin-layer-studio/subscribe/checkout":{"get":{"tags":["subscription"],"summary":"Subscription Checkout","description":"SkinLayerStudio 구독 결제 페이지. 비로그인 → /login 리다이렉트.","operationId":"subscription_checkout__lang__skin_layer_studio_subscribe_checkout_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/my-subscription":{"get":{"tags":["subscription"],"summary":"My Subscription Page","description":"내 구독 페이지 — 구독 요약 + 결제 내역. 비로그인 → /login 리다이렉트.","operationId":"my_subscription_page__lang__my_subscription_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/my-subscription/invoice/{transaction_id}":{"get":{"tags":["subscription"],"summary":"My Subscription Invoice","description":"[LEGACY] M1-2 URL — 신규 통합 인보이스 라우트로 301 리다이렉트.","operationId":"my_subscription_invoice__lang__my_subscription_invoice__transaction_id__get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"transaction_id","in":"path","required":true,"schema":{"type":"string","title":"Transaction Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/my-invoices":{"get":{"tags":["subscription"],"summary":"My Invoices Page","description":"구매형+구독형 인보이스 통합 목록. 이 계정이 결제한 것만 (배정만 받은 팀원은 빈 목록).","operationId":"my_invoices_page__lang__my_invoices_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/my-invoices/{transaction_id}":{"get":{"tags":["subscription"],"summary":"My Invoices Invoice","description":"결제 인보이스 PDF 온디맨드 발급 → 302 redirect.\n\nPaddle GET /transactions/{id}/invoice 로 임시 서명 URL 발급.\n소유권 검증: 구독 결제 ∪ 구매 라이센스(Paddle txn 복원분) 합집합에만 접근 허용.","operationId":"my_invoices_invoice__lang__my_invoices__transaction_id__get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"transaction_id","in":"path","required":true,"schema":{"type":"string","title":"Transaction Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/my-subscription/cancel":{"post":{"tags":["subscription"],"summary":"My Subscription Cancel","description":"구독 기간 말 취소 요청.\n\nPaddle POST /subscriptions/{id}/cancel (effective_from=next_billing_period).\n소유권 검증: 현재 사용자 이메일에 속한 구독만 취소 허용.\nDB 반영은 기존 웹훅(subscription.updated/canceled)이 자동 동기화.","operationId":"my_subscription_cancel__lang__my_subscription_cancel_post","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/my-subscription/devices/update-list":{"post":{"tags":["subscription"],"summary":"My Subscription Devices Update","description":"기기 ✕ 제거 — update-list 단일 계약.\n\n세션 email 취득 + 서버사이드로 access_key 조회 → 새 리스트 계산 → DB update-list 호출.\nemail / access_key 는 폼으로 받지 않음(클라 위조 방지).","operationId":"my_subscription_devices_update__lang__my_subscription_devices_update_list_post","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/team-subscriptions/assign":{"post":{"tags":["subscription"],"summary":"Assign Team Subscription Seat","description":"구독 시트 배정/재배정 — access_key 기준.","operationId":"assign_team_subscription_seat_api_team_subscriptions_assign_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamSeatAssignModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/team-subscriptions/unassign":{"post":{"tags":["subscription"],"summary":"Unassign Team Subscription Seat","description":"구독 시트 회수 — 이메일만 떼고 시트는 유지(미배정).","operationId":"unassign_team_subscription_seat_api_team_subscriptions_unassign_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamSeatActionModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/team-subscriptions/cancel":{"post":{"tags":["subscription"],"summary":"Cancel Team Subscription Seat","description":"구독 시트 구독취소 — 갱신일까지는 계속 이용 가능 (즉시 차단 아님).","operationId":"cancel_team_subscription_seat_api_team_subscriptions_cancel_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamSeatActionModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/team-subscriptions/align-request":{"post":{"tags":["subscription"],"summary":"Request Subscription Align","description":"갱신일 조정 신청 접수 — subscriptions 테이블은 절대 건드리지 않는다.\n\n처리: ① subscription_align_requests INSERT → ② Telegram 알림 → ③ 200.\nrate limit: 계정당 1일 3회 (IP 기준이 아닌 계정 기준 — DB 카운트로 직접 검증).","operationId":"request_subscription_align_api_team_subscriptions_align_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlignRequestModel"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/authorize":{"get":{"tags":["oauth"],"summary":"Oauth Authorize","description":"Authorization consent 화면 (Cursor 스타일).","operationId":"oauth_authorize_oauth_authorize_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/authorize/confirm":{"post":{"tags":["oauth"],"summary":"Oauth Authorize Confirm","description":"사용자 consent 후 authorization code 발급.","operationId":"oauth_authorize_confirm_oauth_authorize_confirm_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_oauth_authorize_confirm_oauth_authorize_confirm_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/authorize/cancel":{"get":{"tags":["oauth"],"summary":"Oauth Authorize Cancel","description":"사용자가 consent 를 거부 → loopback access_denied.","operationId":"oauth_authorize_cancel_oauth_authorize_cancel_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/token":{"post":{"tags":["oauth"],"summary":"Oauth Token","description":"access_token / id_token / refresh_token 발급.","operationId":"oauth_token_oauth_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_oauth_token_oauth_token_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/revoke":{"post":{"tags":["oauth"],"summary":"Oauth Revoke","description":"refresh_token 폐기 (로그아웃). RFC 7009.","operationId":"oauth_revoke_oauth_revoke_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_oauth_revoke_oauth_revoke_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/debug/toss-test":{"get":{"tags":["toss"],"summary":"Toss Test Page","description":"Toss Payments 테스트 결제창 — Fast_Ref ₩1,000 (admin 전용, 실출금 없음)","operationId":"toss_test_page__lang__debug_toss_test_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/debug/toss-success":{"get":{"tags":["toss"],"summary":"Toss Success Page","description":"Toss 결제 성공 리다이렉트 확인 (admin 전용)","operationId":"toss_success_page__lang__debug_toss_success_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/debug/toss-fail":{"get":{"tags":["toss"],"summary":"Toss Fail Page","description":"Toss 결제 실패/취소 리다이렉트 확인 (admin 전용)","operationId":"toss_fail_page__lang__debug_toss_fail_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/debug/toss-report":{"post":{"tags":["toss"],"summary":"Toss Report","description":"결제창 로드/오픈 실패 등 클라이언트 측 오류를 수신해 텔레그램 통지 (admin 전용).","operationId":"toss_report__lang__debug_toss_report_post","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/review/toss/{token}":{"get":{"tags":["toss"],"summary":"Toss Review Root","description":"언어 접두사 없이 들어온 심사 링크를 한국어 페이지로 넘긴다.","operationId":"toss_review_root_review_toss__token__get","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"}}}}}}},"/{lang}/review/toss/{token}":{"get":{"tags":["toss"],"summary":"Toss Review Page","description":"토스 계약심사용 결제 테스트 페이지 (테스트키 · 실출금 없음).","operationId":"toss_review_page__lang__review_toss__token__get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/review/toss/{token}/success":{"get":{"tags":["toss"],"summary":"Toss Review Success Page","description":"심사용 결제 성공 리턴 — 결제창 인증 결과 파라미터 표시.","operationId":"toss_review_success_page__lang__review_toss__token__success_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/review/toss/{token}/fail":{"get":{"tags":["toss"],"summary":"Toss Review Fail Page","description":"심사용 결제 실패/취소 리턴 — 심사 중 막힘을 즉시 알 수 있게 통지한다.","operationId":"toss_review_fail_page__lang__review_toss__token__fail_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/review/toss/{token}/report":{"post":{"tags":["toss"],"summary":"Toss Review Report","description":"심사원 브라우저에서 SDK/결제창이 깨진 경우를 즉시 통지받는다.","operationId":"toss_review_report__lang__review_toss__token__report_post","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"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"}}}}}}},"/{lang}/review/toss/{token}/fast-ref":{"get":{"tags":["toss"],"summary":"Toss Review Fast Ref Page","description":"Fast Ref 심사용 상품 페이지. 구매 버튼은 기존 단건 테스트 결제창이다.","operationId":"toss_review_fast_ref_page__lang__review_toss__token__fast_ref_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/review/toss/{token}/skin-layer-studio":{"get":{"tags":["toss"],"summary":"Toss Review Sls Page","description":"SLS 심사용 상품 페이지. 구매 버튼은 빌링 카드 등록이다.","operationId":"toss_review_sls_page__lang__review_toss__token__skin_layer_studio_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/review/toss/{token}/skin-layer-studio/pay":{"get":{"tags":["toss"],"summary":"Toss Review Sls Pay Page","operationId":"toss_review_sls_pay_page__lang__review_toss__token__skin_layer_studio_pay_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/review/toss/{token}/skin-layer-studio/pay/success":{"get":{"tags":["toss"],"summary":"Toss Review Sls Pay Success","operationId":"toss_review_sls_pay_success__lang__review_toss__token__skin_layer_studio_pay_success_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/review/toss/{token}/skin-layer-studio/pay/fail":{"get":{"tags":["toss"],"summary":"Toss Review Sls Pay Fail","operationId":"toss_review_sls_pay_fail__lang__review_toss__token__skin_layer_studio_pay_fail_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/review/toss/{token}/skin-layer-studio/pay/cancel":{"post":{"tags":["toss"],"summary":"Toss Review Sls Pay Cancel","operationId":"toss_review_sls_pay_cancel__lang__review_toss__token__skin_layer_studio_pay_cancel_post","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/toss/checkout/{sku}":{"get":{"tags":["toss-order"],"summary":"Toss Checkout Page","operationId":"toss_checkout_page__lang__toss_checkout__sku__get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"sku","in":"path","required":true,"schema":{"type":"string","title":"Sku"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/toss/orders":{"post":{"tags":["toss-order"],"summary":"Toss Create Order","operationId":"toss_create_order_api_toss_orders_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/toss/coupon/preview":{"post":{"tags":["toss-order"],"summary":"Toss Coupon Preview","description":"결제 페이지 쿠폰 적용 미리보기 (WEB-N-033). 금액은 서버가 계산한다 — 주문 생성 때 다시 계산한다.","operationId":"toss_coupon_preview_api_toss_coupon_preview_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/{lang}/toss/orders/{order_id}/success":{"get":{"tags":["toss-order"],"summary":"Toss Order Success","operationId":"toss_order_success__lang__toss_orders__order_id__success_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/toss/orders/{order_id}/fail":{"get":{"tags":["toss-order"],"summary":"Toss Order Fail","operationId":"toss_order_fail__lang__toss_orders__order_id__fail_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/admin/toss/live-check":{"get":{"tags":["toss-order"],"summary":"Toss Admin Live Check","operationId":"toss_admin_live_check__lang__admin_toss_live_check_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/toss/orders":{"get":{"tags":["toss-order"],"summary":"Toss Admin Orders","operationId":"toss_admin_orders_api_admin_toss_orders_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/my-invoices/toss/{order_id}.pdf":{"get":{"tags":["toss-order"],"summary":"Toss Invoice Download","description":"고객 인보이스 「다운로드」 — 본인 주문만 (남의 주문·없는 주문은 똑같이 404).","operationId":"toss_invoice_download__lang__my_invoices_toss__order_id__pdf_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}},{"name":"variant","in":"query","required":false,"schema":{"type":"string","default":"","title":"Variant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/admin/toss/orders/{order_id}/invoice.pdf":{"get":{"tags":["toss-order"],"summary":"Toss Admin Invoice Download","description":"관리자 「토스 주문 관리」 행의 PDF (세션 관리자).","operationId":"toss_admin_invoice_download__lang__admin_toss_orders__order_id__invoice_pdf_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}},{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}},{"name":"variant","in":"query","required":false,"schema":{"type":"string","default":"","title":"Variant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/{lang}/admin/toss/orders":{"get":{"tags":["toss-order"],"summary":"Toss Admin Orders Page","description":"관리자 주문 목록·취소·재발급 화면. 1,100원 라이브 확인 결제 뒤 취소도 여기서 한다.","operationId":"toss_admin_orders_page__lang__admin_toss_orders_get","parameters":[{"name":"lang","in":"path","required":true,"schema":{"type":"string","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/toss/receipts/backfill":{"post":{"tags":["toss-order"],"summary":"Toss Admin Receipts Backfill","description":"관리자 화면 「인보이스 만들기」 — 승인·취소 주문의 자체 인보이스를 빠짐없이 발행·업로드 (WEB-N-029 M2).","operationId":"toss_admin_receipts_backfill_api_admin_toss_receipts_backfill_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/toss/orders/{order_id}/receipt-email":{"post":{"tags":["toss-order"],"summary":"Toss Admin Receipt Email","description":"관리자 「영수증 메일 다시 보내기」 (WEB-N-029 M3).","operationId":"toss_admin_receipt_email_api_admin_toss_orders__order_id__receipt_email_post","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/toss/orders/{order_id}/cancel":{"post":{"tags":["toss-order"],"summary":"Toss Admin Cancel","operationId":"toss_admin_cancel_api_admin_toss_orders__order_id__cancel_post","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/toss/orders/{order_id}/retry-issue":{"post":{"tags":["toss-order"],"summary":"Toss Admin Retry","operationId":"toss_admin_retry_api_admin_toss_orders__order_id__retry_issue_post","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/toss/orders/{order_id}/reconcile":{"post":{"tags":["toss-order"],"summary":"Toss Admin Reconcile","operationId":"toss_admin_reconcile_api_admin_toss_orders__order_id__reconcile_post","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/infra/session":{"get":{"tags":["infra"],"summary":"Infra Session","operationId":"infra_session_api_infra_session_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/infra/release/rigging-base-toolkit":{"get":{"tags":["infra"],"summary":"Infra Release Catalog","operationId":"infra_release_catalog_api_infra_release_rigging_base_toolkit_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/infra/release/rigging-base-toolkit/file/{file_name}":{"get":{"tags":["infra"],"summary":"Infra Release File","operationId":"infra_release_file_api_infra_release_rigging_base_toolkit_file__file_name__get","parameters":[{"name":"file_name","in":"path","required":true,"schema":{"type":"string","title":"File Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/infra/resources":{"get":{"tags":["infra"],"summary":"Infra Resource Catalog","operationId":"infra_resource_catalog_api_infra_resources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/infra/resources/{slug}/cover":{"get":{"tags":["infra"],"summary":"Infra Resource Cover","operationId":"infra_resource_cover_api_infra_resources__slug__cover_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/infra/resources/ticket":{"post":{"tags":["infra"],"summary":"Infra Resource Ticket","operationId":"infra_resource_ticket_api_infra_resources_ticket_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/infra/resources/file/{token}":{"get":{"tags":["infra"],"summary":"Infra Resource File","operationId":"infra_resource_file_api_infra_resources_file__token__get","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/infra/rigging-base-toolkit/license":{"post":{"tags":["infra"],"summary":"Infra Rigging Base License","description":"Admin session gets one RiggingBaseToolKit key while the toolkit is in build.","operationId":"infra_rigging_base_license_api_infra_rigging_base_toolkit_license_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/devdash/session":{"get":{"tags":["devdash"],"summary":"Devdash Session","operationId":"devdash_session_api_devdash_session_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/mktgdash/session":{"get":{"tags":["mktgdash"],"summary":"Mktgdash Session","operationId":"mktgdash_session_api_mktgdash_session_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/mktgdash/metrics":{"get":{"tags":["mktgdash"],"summary":"Mktgdash Metrics","operationId":"mktgdash_metrics_api_mktgdash_metrics_get","parameters":[{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/script/admin-check":{"post":{"tags":["script"],"summary":"Script Admin Check","description":"라이선스 키가 맞는 이메일의 role 이 admin 인지만 답한다.\n\n성공: {\"ok\": true, \"admin\": bool}\n필드 비움: 400\n라이선스 서버 실패: 503  (admin true 를 만들지 않는다)\n요청에 role 이 있어도 무시한다.","operationId":"script_admin_check_api_script_admin_check_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScriptAdminCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/test-log":{"get":{"summary":"Test Log","description":"Railway Deploy Logs 테스트용 엔드포인트","operationId":"test_log_test_log_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AlignRequestModel":{"properties":{"product_name":{"type":"string","title":"Product Name"},"corp_bundle_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Corp Bundle Id"},"billing_day":{"type":"integer","title":"Billing Day"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"reply_email":{"type":"string","format":"email","title":"Reply Email"}},"type":"object","required":["product_name","billing_day","reply_email"],"title":"AlignRequestModel"},"AppUpdatePingModel":{"properties":{"product_id":{"type":"string","title":"Product Id"},"filename":{"type":"string","title":"Filename","default":""}},"type":"object","required":["product_id"],"title":"AppUpdatePingModel","description":"인앱 업데이트가 받기를 시작할 때. 쿠키 없이 라이선스 헤더로 알린다."},"AssignLicenseModel":{"properties":{"product_name":{"type":"string","title":"Product Name"},"license_key":{"type":"string","title":"License Key"},"new_email":{"type":"string","title":"New Email"},"reset_machines":{"type":"boolean","title":"Reset Machines","default":false}},"type":"object","required":["product_name","license_key","new_email"],"title":"AssignLicenseModel","description":"라이센스 배정 요청 - license_key 기반"},"BetaPersonalApplyModel":{"properties":{"name":{"type":"string","title":"Name"},"company":{"type":"string","title":"Company"},"phone":{"type":"string","title":"Phone","default":""},"contact_position":{"type":"string","title":"Contact Position"},"experience":{"type":"string","title":"Experience"},"country":{"type":"string","title":"Country","default":""},"message":{"type":"string","title":"Message"},"questions":{"type":"string","title":"Questions"},"product_name":{"type":"string","title":"Product Name","default":"BipedPlus"}},"type":"object","required":["name","company","contact_position","experience","message","questions"],"title":"BetaPersonalApplyModel","description":"개인 베타 신청 요청 (v2)"},"BetaTeamApplyModel":{"properties":{"beta_type":{"type":"string","title":"Beta Type"},"company_name":{"type":"string","title":"Company Name"},"project_name":{"type":"string","title":"Project Name"},"team_size":{"type":"string","title":"Team Size"},"contact_name":{"type":"string","title":"Contact Name"},"contact_position":{"type":"string","title":"Contact Position"},"phone":{"type":"string","title":"Phone"},"email":{"type":"string","title":"Email"},"message":{"type":"string","title":"Message"},"questions":{"type":"string","title":"Questions"},"product_name":{"type":"string","title":"Product Name","default":"Fast_Ref"}},"type":"object","required":["beta_type","company_name","project_name","team_size","contact_name","contact_position","phone","email","message","questions"],"title":"BetaTeamApplyModel","description":"베타팀 신청 요청"},"Body_content_push_api_content_push_post":{"properties":{"file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"File"}},"type":"object","title":"Body_content_push_api_content_push_post"},"Body_create_business_order_api_api_early_access_business_post":{"properties":{"name":{"type":"string","title":"Name"},"email":{"type":"string","title":"Email"},"phone":{"type":"string","title":"Phone"},"company_name":{"type":"string","title":"Company Name"},"quantity":{"type":"integer","title":"Quantity"},"event_code":{"type":"string","title":"Event Code","default":""},"agree_terms":{"type":"string","title":"Agree Terms"},"loi_files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Loi Files","default":[]},"is_update":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Is Update"},"existing_order_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Existing Order Id"}},"type":"object","required":["name","email","phone","company_name","quantity","agree_terms"],"title":"Body_create_business_order_api_api_early_access_business_post"},"Body_create_feedback_api_feedback_post":{"properties":{"category":{"type":"string","title":"Category"},"product":{"type":"string","title":"Product"},"title":{"type":"string","title":"Title"},"content":{"type":"string","title":"Content"},"images":{"items":{"type":"string","format":"binary"},"type":"array","title":"Images","default":[]}},"type":"object","required":["category","product","title","content"],"title":"Body_create_feedback_api_feedback_post"},"Body_create_personal_order_api_api_early_access_personal_post":{"properties":{"name":{"type":"string","title":"Name"},"email":{"type":"string","title":"Email"},"phone":{"type":"string","title":"Phone"},"event_code":{"type":"string","title":"Event Code","default":""},"agree_terms":{"type":"string","title":"Agree Terms"},"receipt_file":{"anyOf":[{"type":"string","format":"binary"},{"type":"null"}],"title":"Receipt File"},"depositor_bank":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Depositor Bank"},"depositor_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Depositor Name"},"quantity":{"type":"integer","title":"Quantity","default":1},"is_update":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Is Update"},"existing_order_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Existing Order Id"}},"type":"object","required":["name","email","phone","agree_terms"],"title":"Body_create_personal_order_api_api_early_access_personal_post"},"Body_mail_media_upload_admin_mail_media_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_mail_media_upload_admin_mail_media_upload_post"},"Body_oauth_authorize_confirm_oauth_authorize_confirm_post":{"properties":{"client_id":{"type":"string","title":"Client Id"},"redirect_uri":{"type":"string","title":"Redirect Uri"},"code_challenge":{"type":"string","title":"Code Challenge"},"code_challenge_method":{"type":"string","title":"Code Challenge Method"},"state":{"type":"string","title":"State"},"response_type":{"type":"string","title":"Response Type","default":"code"},"scope":{"type":"string","title":"Scope","default":"profile"}},"type":"object","required":["client_id","redirect_uri","code_challenge","code_challenge_method","state"],"title":"Body_oauth_authorize_confirm_oauth_authorize_confirm_post"},"Body_oauth_revoke_oauth_revoke_post":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"Body_oauth_revoke_oauth_revoke_post"},"Body_oauth_token_oauth_token_post":{"properties":{"grant_type":{"type":"string","title":"Grant Type"},"client_id":{"type":"string","title":"Client Id"},"code":{"type":"string","title":"Code"},"code_verifier":{"type":"string","title":"Code Verifier"},"redirect_uri":{"type":"string","title":"Redirect Uri"},"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["grant_type","client_id"],"title":"Body_oauth_token_oauth_token_post"},"Body_send_connector_report_api_contact_connector_post":{"properties":{"product":{"type":"string","title":"Product"},"dcc":{"type":"string","title":"Dcc"},"subject":{"type":"string","title":"Subject"},"message":{"type":"string","title":"Message"},"reply_email":{"type":"string","title":"Reply Email","default":""}},"type":"object","required":["product","dcc","subject","message"],"title":"Body_send_connector_report_api_contact_connector_post"},"Body_send_contact_inquiry_api_contact_post":{"properties":{"from_email":{"type":"string","title":"From Email"},"subject":{"type":"string","title":"Subject"},"message":{"type":"string","title":"Message"},"lang":{"type":"string","title":"Lang","default":"en"},"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"}},"type":"object","required":["from_email","subject","message"],"title":"Body_send_contact_inquiry_api_contact_post"},"Body_submit_feature_request_api_feature_request_post":{"properties":{"email":{"type":"string","title":"Email"},"product":{"type":"string","title":"Product"},"request_type":{"type":"string","title":"Request Type"},"subject":{"type":"string","title":"Subject"},"message":{"type":"string","title":"Message"},"lang":{"type":"string","title":"Lang","default":"en"},"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"}},"type":"object","required":["email","product","request_type","subject","message"],"title":"Body_submit_feature_request_api_feature_request_post"},"Body_submit_partnership_api_partnership_post":{"properties":{"name":{"type":"string","title":"Name"},"email":{"type":"string","title":"Email"},"phone":{"type":"string","title":"Phone","default":""},"partner_type":{"type":"string","title":"Partner Type"},"subject":{"type":"string","title":"Subject"},"message":{"type":"string","title":"Message"},"portfolio_url":{"type":"string","title":"Portfolio Url","default":""},"privacy_agreed":{"type":"boolean","title":"Privacy Agreed"},"lang":{"type":"string","title":"Lang","default":"en"},"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files"}},"type":"object","required":["name","email","partner_type","subject","message","privacy_agreed"],"title":"Body_submit_partnership_api_partnership_post"},"Body_sync_volume_from_gdrive_admin_sync_volume_from_gdrive_post":{"properties":{"product":{"type":"string","title":"Product"}},"type":"object","required":["product"],"title":"Body_sync_volume_from_gdrive_admin_sync_volume_from_gdrive_post"},"Body_update_feedback_api_feedback__feedback_id__put":{"properties":{"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"product":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"new_images":{"items":{"type":"string","format":"binary"},"type":"array","title":"New Images","default":[]}},"type":"object","title":"Body_update_feedback_api_feedback__feedback_id__put"},"Body_upload_to_volume_admin_upload_to_volume_post":{"properties":{"product":{"type":"string","title":"Product"},"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["product","file"],"title":"Body_upload_to_volume_admin_upload_to_volume_post"},"BuyerInfoModel":{"properties":{"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"company":{"type":"string","title":"Company"},"country":{"type":"string","title":"Country"},"address_line1":{"type":"string","title":"Address Line1"},"address_line2":{"type":"string","title":"Address Line2"},"city":{"type":"string","title":"City"},"state":{"type":"string","title":"State"},"zip_code":{"type":"string","title":"Zip Code"},"phone":{"type":"string","title":"Phone"}},"type":"object","required":["first_name","last_name","company","country","address_line1","address_line2","city","state","zip_code","phone"],"title":"BuyerInfoModel","description":"구매자 정보"},"ChangePasswordRequest":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","title":"New Password"},"new_password_confirm":{"type":"string","title":"New Password Confirm"}},"type":"object","required":["current_password","new_password","new_password_confirm"],"title":"ChangePasswordRequest","description":"비밀번호 변경 요청"},"CleanupEmptyBody":{"properties":{"confirm":{"type":"boolean","title":"Confirm","default":false},"dry_run":{"type":"boolean","title":"Dry Run","default":true}},"type":"object","title":"CleanupEmptyBody"},"DeleteBody":{"properties":{"paths":{"items":{"type":"string"},"type":"array","title":"Paths"},"confirm":{"type":"boolean","title":"Confirm","default":false},"force":{"type":"boolean","title":"Force","default":false}},"type":"object","required":["paths"],"title":"DeleteBody"},"DownloadTrackModel":{"properties":{"product_id":{"type":"string","title":"Product Id"},"version":{"type":"string","title":"Version","default":""},"filename":{"type":"string","title":"Filename","default":""},"download_type":{"type":"string","title":"Download Type","default":"google"}},"type":"object","required":["product_id"],"title":"DownloadTrackModel","description":"다운로드 추적 요청\n\n⚠️ version 은 MZP 제품(fast-ref 등)에서만 의미가 있다.\n   SkinLayer Studio 같은 standalone EXE 제품은 max 버전 개념이 없어\n   version 을 생략하므로 optional(기본 \"\") 로 둔다."},"DriveBody":{"properties":{"drive_file_id":{"type":"string","title":"Drive File Id"},"version":{"type":"string","title":"Version","default":""}},"type":"object","required":["drive_file_id"],"title":"DriveBody"},"DummyGrantModel":{"properties":{"kind":{"type":"string","title":"Kind"},"product_id":{"type":"string","title":"Product Id"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"}},"type":"object","required":["kind","product_id"],"title":"DummyGrantModel","description":"MotionHub dummy grant. Session email only — body email is ignored."},"DuplicateCheckModel":{"properties":{"email":{"type":"string","title":"Email"},"product_name":{"type":"string","title":"Product Name"},"tag":{"type":"string","title":"Tag"},"order_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order Type"}},"type":"object","required":["email","product_name","tag"],"title":"DuplicateCheckModel","description":"중복 체크 요청"},"ForgotPasswordRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordRequest","description":"비밀번호 찾기 요청"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"}},"type":"object","required":["email","password"],"title":"LoginRequest","description":"로그인 요청"},"MarketingPreferencesRequest":{"properties":{"email_agreed":{"type":"boolean","title":"Email Agreed"},"sms_agreed":{"type":"boolean","title":"Sms Agreed"}},"type":"object","required":["email_agreed","sms_agreed"],"title":"MarketingPreferencesRequest"},"ModerateFeedbackRequest":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"admin_reply":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Reply"}},"type":"object","title":"ModerateFeedbackRequest","description":"관리자 운영 요청 (status 변경 + 답변 갱신)"},"NutstoreDownloadModel":{"properties":{"product_id":{"type":"string","title":"Product Id"},"version":{"type":"string","title":"Version"}},"type":"object","required":["product_id","version"],"title":"NutstoreDownloadModel","description":"견과운 임시 다운로드 주소 요청. product_id 는 다운로드 페이지 카탈로그 id."},"PaymentNotificationModel":{"properties":{"purchase_id":{"type":"integer","title":"Purchase Id"}},"type":"object","required":["purchase_id"],"title":"PaymentNotificationModel","description":"입금 완료 알림 요청"},"PlayerRequestModel":{"properties":{"product_id":{"type":"string","title":"Product Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"company":{"type":"string","title":"Company"},"address1":{"type":"string","title":"Address1"},"address2":{"type":"string","title":"Address2"},"city":{"type":"string","title":"City"},"state":{"type":"string","title":"State"},"zip_code":{"type":"string","title":"Zip Code"},"country":{"type":"string","title":"Country"},"phone":{"type":"string","title":"Phone"}},"type":"object","required":["product_id","first_name","last_name","company","address1","address2","city","state","zip_code","country","phone"],"title":"PlayerRequestModel","description":"애니메이터 에디션(player) 신청 요청 — TrialRequestModel 과 동일 필드."},"PurchaseRequestModel":{"properties":{"product_id":{"type":"string","title":"Product Id"},"payment_method":{"type":"string","title":"Payment Method"},"depositor_name":{"type":"string","title":"Depositor Name"},"buyer_info":{"$ref":"#/components/schemas/BuyerInfoModel"},"coupon_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coupon Code"}},"type":"object","required":["product_id","payment_method","depositor_name","buyer_info"],"title":"PurchaseRequestModel","description":"구매 신청 요청"},"RegisterRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"password_confirm":{"type":"string","title":"Password Confirm"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"agree_terms":{"type":"boolean","title":"Agree Terms"},"agree_privacy":{"type":"boolean","title":"Agree Privacy"}},"type":"object","required":["email","password","password_confirm","first_name","last_name","agree_terms","agree_privacy"],"title":"RegisterRequest","description":"회원가입 요청 (Step 3 - 인증 완료 후)"},"RelocateDocsOldBody":{"properties":{"confirm":{"type":"boolean","title":"Confirm","default":false},"dry_run":{"type":"boolean","title":"Dry Run","default":true}},"type":"object","title":"RelocateDocsOldBody"},"ResetPasswordRequest":{"properties":{"password":{"type":"string","title":"Password"},"password_confirm":{"type":"string","title":"Password Confirm"}},"type":"object","required":["password","password_confirm"],"title":"ResetPasswordRequest","description":"비밀번호 재설정 요청"},"SavingsFeedbackBody":{"properties":{"lang":{"type":"string","title":"Lang","default":"en"},"currency":{"type":"string","title":"Currency","default":""},"pay_mode":{"type":"string","title":"Pay Mode","default":""},"preset":{"type":"string","title":"Preset","default":""},"fields":{"items":{"type":"string"},"type":"array","title":"Fields","default":[]},"actual_value":{"type":"string","title":"Actual Value","default":""},"comment":{"type":"string","title":"Comment","default":""},"source_url":{"type":"string","title":"Source Url","default":""},"contact":{"type":"string","title":"Contact","default":""},"email":{"type":"string","title":"Email","default":""},"website":{"type":"string","title":"Website","default":""},"inputs":{"additionalProperties":{"type":"string"},"type":"object","title":"Inputs","default":{}},"result_text":{"type":"string","title":"Result Text","default":""}},"type":"object","title":"SavingsFeedbackBody","description":"Fast Ref 계산기 피드백. 보내는 사람 메일은 필수가 아니다."},"ScriptAdminCheckRequest":{"properties":{"email":{"type":"string","title":"Email"},"license_key":{"type":"string","title":"License Key","default":""},"product_name":{"type":"string","title":"Product Name"},"access_token":{"type":"string","title":"Access Token","default":""},"refresh_token":{"type":"string","title":"Refresh Token","default":""}},"type":"object","required":["email","product_name"],"title":"ScriptAdminCheckRequest"},"SendCodeRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"SendCodeRequest","description":"인증 코드 발송 요청 (Step 1)"},"SubscribeRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"product_name":{"type":"string","title":"Product Name"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"}},"type":"object","required":["email","product_name"],"title":"SubscribeRequest","description":"알림 신청 요청"},"TeamSeatActionModel":{"properties":{"product_name":{"type":"string","title":"Product Name"},"access_key":{"type":"string","title":"Access Key"}},"type":"object","required":["product_name","access_key"],"title":"TeamSeatActionModel"},"TeamSeatAssignModel":{"properties":{"product_name":{"type":"string","title":"Product Name"},"access_key":{"type":"string","title":"Access Key"},"new_email":{"type":"string","format":"email","title":"New Email"}},"type":"object","required":["product_name","access_key","new_email"],"title":"TeamSeatAssignModel"},"TrialRequestModel":{"properties":{"product_id":{"type":"string","title":"Product Id"},"first_name":{"type":"string","title":"First Name"},"last_name":{"type":"string","title":"Last Name"},"company":{"type":"string","title":"Company"},"address1":{"type":"string","title":"Address1"},"address2":{"type":"string","title":"Address2"},"city":{"type":"string","title":"City"},"state":{"type":"string","title":"State"},"zip_code":{"type":"string","title":"Zip Code"},"country":{"type":"string","title":"Country"},"phone":{"type":"string","title":"Phone"}},"type":"object","required":["product_id","first_name","last_name","company","address1","address2","city","state","zip_code","country","phone"],"title":"TrialRequestModel","description":"체험 신청 요청"},"UnassignLicenseModel":{"properties":{"product_name":{"type":"string","title":"Product Name"},"license_key":{"type":"string","title":"License Key"}},"type":"object","required":["product_name","license_key"],"title":"UnassignLicenseModel","description":"라이센스 회수 요청 - license_key 기반"},"UpdateProfileRequest":{"properties":{"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"nickname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nickname"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"address_line1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line1"},"address_line2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line2"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"zip_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zip Code"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"}},"type":"object","title":"UpdateProfileRequest","description":"프로필 수정 요청"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyCodeRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"code":{"type":"string","title":"Code"}},"type":"object","required":["email","code"],"title":"VerifyCodeRequest","description":"인증 코드 검증 요청 (Step 2)"},"VisibilityBody":{"properties":{"admin_only":{"type":"boolean","title":"Admin Only"}},"type":"object","required":["admin_only"],"title":"VisibilityBody"}}}}