{"openapi":"3.1.0","info":{"title":"高达模型屋 API","description":"高达模型屋 Backend API · https://gundam.y1226.vip","version":"1.0.0"},"paths":{"/api/v1/auth/register":{"post":{"tags":["auth"],"summary":"Register","description":"注册新账号（邮箱 + 密码 + 邀请码）","operationId":"register_api_v1_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/verify-email":{"get":{"tags":["auth"],"summary":"Verify Email By Token","description":"通过链接验证（邮件点击）","operationId":"verify_email_by_token_api_v1_auth_verify_email_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/verify-code":{"post":{"tags":["auth"],"summary":"Verify Email By Code","description":"通过 6 位验证码验证","operationId":"verify_email_by_code_api_v1_auth_verify_code_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/resend-verification":{"post":{"tags":["auth"],"summary":"Resend Verification","description":"重发验证邮件","operationId":"resend_verification_api_v1_auth_resend_verification_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"邮箱 / 用户名 + 密码登录","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/change-password":{"post":{"tags":["auth"],"summary":"Change Password","description":"修改密码（已登录 App）","operationId":"change_password_api_v1_auth_change_password_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/forgot-password":{"post":{"tags":["auth"],"summary":"Forgot Password","description":"忘记密码 - 发送重置邮件","operationId":"forgot_password_api_v1_auth_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/reset-password":{"post":{"tags":["auth"],"summary":"Reset Password","description":"通过 token 或 code 重置密码","operationId":"reset_password_api_v1_auth_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invites":{"post":{"tags":["invites"],"summary":"Create Invite","description":"生成邀请码\n- 普通用户：默认 7 天有效，1 次使用\n- 管理员：默认 100 年有效，999 次使用","operationId":"create_invite_api_v1_invites_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["invites"],"summary":"List My Invites","description":"列出我创建的邀请码","operationId":"list_my_invites_api_v1_invites_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invites/verify":{"post":{"tags":["invites"],"summary":"Verify Invite","description":"验证邀请码（不需要登录）","operationId":"verify_invite_api_v1_invites_verify_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/health":{"get":{"tags":["system"],"summary":"Health","operationId":"health_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/auth/anonymous":{"post":{"tags":["auth-deprecated"],"summary":"Anonymous Auth","description":"兼容旧版匿名登录（推荐新用户用 /auth/register）","operationId":"anonymous_auth_api_v1_auth_anonymous_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnonymousAuthRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ms":{"get":{"tags":["mobile_suites"],"summary":"List Ms","operationId":"list_ms_api_v1_ms_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}},{"name":"series","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Series"}},{"name":"grade","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grade"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(name|release_year)$","default":"name","title":"Sort"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ms/{suite_id}":{"get":{"tags":["mobile_suites"],"summary":"Get Ms","operationId":"get_ms_api_v1_ms__suite_id__get","parameters":[{"name":"suite_id","in":"path","required":true,"schema":{"type":"string","title":"Suite Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MobileSuiteDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/variants/{variant_id}":{"get":{"tags":["mobile_suites"],"summary":"Get Variant","operationId":"get_variant_api_v1_variants__variant_id__get","parameters":[{"name":"variant_id","in":"path","required":true,"schema":{"type":"integer","title":"Variant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VariantRead"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge/timeline":{"get":{"tags":["knowledge"],"summary":"List Timeline","operationId":"list_timeline_api_v1_knowledge_timeline_get","parameters":[{"name":"series","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Series"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge/pilots":{"get":{"tags":["knowledge"],"summary":"List Pilots","operationId":"list_pilots_api_v1_knowledge_pilots_get","parameters":[{"name":"series","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Series"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge/terms":{"get":{"tags":["knowledge"],"summary":"List Terms","operationId":"list_terms_api_v1_knowledge_terms_get","parameters":[{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/knowledge/guides":{"get":{"tags":["knowledge"],"summary":"List Guides","operationId":"list_guides_api_v1_knowledge_guides_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me/collection":{"get":{"tags":["collection"],"summary":"List My Collection","operationId":"list_my_collection_api_v1_me_collection_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["collection"],"summary":"Add Collection","operationId":"add_collection_api_v1_me_collection_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/me/collection/{coll_id}":{"patch":{"tags":["collection"],"summary":"Update Collection","operationId":"update_collection_api_v1_me_collection__coll_id__patch","parameters":[{"name":"coll_id","in":"path","required":true,"schema":{"type":"integer","title":"Coll Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CollectionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["collection"],"summary":"Delete Collection","operationId":"delete_collection_api_v1_me_collection__coll_id__delete","parameters":[{"name":"coll_id","in":"path","required":true,"schema":{"type":"integer","title":"Coll Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/app/version":{"get":{"tags":["app"],"summary":"Get Latest Version","description":"获取最新版本信息（App 启动时检测更新）","operationId":"get_latest_version_api_v1_app_version_get","parameters":[{"name":"current_version","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Version"}},{"name":"current_code","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/app/version/list":{"get":{"tags":["app"],"summary":"List Versions","description":"列出所有版本（管理用）","operationId":"list_versions_api_v1_app_version_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/sync":{"get":{"tags":["sync"],"summary":"Sync","description":"增量同步（支持 ETag / If-Modified-Since）\n\n返回:\n  - 304 Not Modified: 数据无更新\n  - 200 OK: 完整数据 + ETag","operationId":"sync_api_v1_sync_get","parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/app/manifest":{"get":{"tags":["app"],"summary":"App Manifest","description":"App 启动时一次性获取的数据（无需认证）","operationId":"app_manifest_api_v1_app_manifest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/changelog":{"get":{"tags":["app"],"summary":"Changelog Api","description":"Changelog JSON API（供 App 调用）。","operationId":"changelog_api_api_v1_changelog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"tags":["system"],"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AnonymousAuthRequest":{"properties":{"device_id":{"type":"string","maxLength":64,"minLength":8,"title":"Device Id"}},"type":"object","required":["device_id"],"title":"AnonymousAuthRequest"},"CollectionCreate":{"properties":{"variant_id":{"type":"integer","title":"Variant Id"},"purchase_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Purchase Date"},"condition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condition"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"photo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Photo Url"}},"type":"object","required":["variant_id"],"title":"CollectionCreate"},"CollectionUpdate":{"properties":{"purchase_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Purchase Date"},"condition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condition"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"photo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Photo Url"}},"type":"object","title":"CollectionUpdate"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"MobileSuiteDetail":{"properties":{"id":{"type":"string","title":"Id"},"model_number":{"type":"string","title":"Model Number"},"name_ja":{"type":"string","title":"Name Ja"},"name_zh":{"type":"string","title":"Name Zh"},"name_en":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name En"},"series":{"type":"string","title":"Series"},"pilot":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pilot"},"debut":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Debut"},"height":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Height"},"weight":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Weight"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"variants":{"items":{"$ref":"#/components/schemas/VariantRead"},"type":"array","title":"Variants","default":[]}},"type":"object","required":["id","model_number","name_ja","name_zh","series"],"title":"MobileSuiteDetail"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VariantRead":{"properties":{"grade":{"type":"string","title":"Grade"},"scale":{"type":"string","title":"Scale"},"release_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Release Year"},"release_month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Release Month"},"price_jpy":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Jpy"},"box_art_url":{"type":"string","title":"Box Art Url"},"product_image_url":{"type":"string","title":"Product Image Url"},"id":{"type":"integer","title":"Id"}},"type":"object","required":["grade","scale","box_art_url","product_image_url","id"],"title":"VariantRead"}}}}