{
  "openapi": "3.0.0",
  "info": {
    "title": "AI 肌分析",
    "description": "# 概要 (Overview)\n![](https://d3ss46vukfdtpo.cloudfront.net/static/media/img_demostore_skincarelive_topbanner.0cffe3a7.jpg)\nAI 肌分析 (AI Skin Analysis) では、真正面を向いた 1 枚のセルフィーから顔の肌悩みを評価します。\nキメ、色素沈着、うるおい、毛穴の大きさなど、肌のさまざまな側面を解析します。\n肌悩みスコアと検出マスクを提供します。\n\n\n## 統合ガイド (Integration Guide)\n* AI 肌分析のための写真の撮影方法\n* 真正面を向いてセルフィーを撮影する\n  - 1 枚の鮮明な写真を、カメラをまっすぐ見つめて撮影します。髪は下ろして胸にかかるようにし、真正面の構図になるよう必ずまっすぐ前方を見てください。\n  - 代わりに JS Camera Kit を使用して撮影します。髪は下ろして胸にかかるようにするだけで構いません。まとめないでください。\n\n* ワークフロー\n**肌診断 API 使用ガイド**\nこのガイドでは、File API と AI Task API を使用して画像をアップロードし、肌診断タスクを作成する方法を説明します。\n\n   * **ステップ 1: 元画像をリサイズする**</br>\n  写真を対応寸法に合わせてリサイズします -  SD は長辺が最大 4096 ピクセルで短辺が 480 ピクセル以上、または HD は長辺が最大 4096 ピクセルで短辺が 1080 ピクセル以上です。詳細は **[ファイル仕様とエラー](#section/overview/File-Specs-and-Errors)** を参照してください\n\n   * **ステップ 2: File API でファイルメタデータをアップロードする**\n- 画像の要件\n    - 詳細は **[ファイル仕様とエラー](#section/overview/File-Specs-and-Errors)** を参照してください\n\nPOST リクエストを送信して、ファイルアップロードを初期化します：\n\n```bash\ncurl --request POST \\\n  --url https://yce-api-01.makeupar.com/s2s/v2.0/file \\\n  --header 'Authorization: Bearer YOUR_API_KEY' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n    \"files\": [\n      {\n        \"content_type\": \"image/png\",\n        \"file_name\": \"skin_analysis_01_3dbd1b6683.png\",\n        \"file_size\": 547541\n      }\n    ]\n  }'\n```\n\n- ***重要***: File API を呼び出すだけではファイルはアップロードされません。**File API のレスポンスで提供される URL** に対してファイルを**追加でアップロード**する必要があります。その URL がアップロード先です。次に進む前に、ファイルが正常に転送されたことを確認してください。\n\n  > **警告:** File API のレスポンスで提供される URL にファイルをアップロードしないまま AI API を使用すると、500 Server Error / unknown_internal_error または 404 Not Found エラーが発生します。\n\n***\n\n   * **ステップ 3: アップロード URL とファイル ID を取得する**\n\nレスポンスには以下が含まれます：\n\n*   `requests.url` – 画像アップロード用のプリサインド URL。\n*   `file_id` – AI タスク作成用の識別子。\n\n**レスポンス例：**\n\n```json\n{\n  \"status\": 200,\n  \"data\": {\n    \"files\": [\n      {\n        \"content_type\": \"image/png\",\n        \"file_name\": \"skin_analysis_01_3dbd1b6683.png\",\n        \"file_id\": \"SaGaqpDgKwFrVBgMpQMA3HY0LeqdT9/13W5TOD8/u/FfjK3xgCQ+hRt9MJXBFaud\",\n        \"requests\": [\n          {\n            \"method\": \"PUT\",\n            \"url\": \"https://yce-us.s3-accelerate.amazonaws.com/demo/ttl30/...signature...\",\n            \"headers\": {\n              \"Content-Length\": \"547541\",\n              \"Content-Type\": \"image/png\"\n            }\n          }\n        ]\n      }\n    ]\n  }\n}\n```\n\n***\n\n   * **ステップ 4: プリサインド URL に画像をアップロードする**\n\n提供された `requests.url` とヘッダーを使用します：\n\n```bash\ncurl --location --request PUT 'https://yce-us.s3-accelerate.amazonaws.com/demo/ttl30/...signature...' \\\n  --header 'Content-Type: image/png' \\\n  --header 'Content-Length: 547541' \\\n  --data-binary @'./skin_analysis_01_3dbd1b6683.png'\n```\n\n***\n\n   * **ステップ 5: AI タスクを作成する**\n\nステップ 2 の `file_id` を使用して肌診断タスクを作成します：\n\n```bash\ncurl --request POST \\\n  --url https://yce-api-01.makeupar.com/s2s/v2.0/task/skin-analysis \\\n  --header 'Authorization: Bearer YOUR_API_KEY' \\\n  --header 'Content-Type: application/json' \\\n  --data '{\n    \"src_file_id\": \"SaGaqpDgKwFrVBgMpQMA3HY0LeqdT9/13W5TOD8/u/FfjK3xgCQ+hRt9MJXBFaud\",\n    \"dst_actions\": [\"wrinkle\", \"pore\", \"texture\", \"acne\"],\n    \"miniserver_args\": {\n      \"enable_mask_overlay\": true,\n      \"enable_dark_background_hd_pore\": true,\n      \"color_dark_background_hd_pore\": \"3D3D3D\",\n      \"opacity_dark_background_hd_pore\": 0.4\n      // Additional parameters omitted for brevity\n    },\n    \"format\": \"json\"\n  }'\n```\n  アップロードが完了したら、ファイル ID または画像ファイル URL を使用して、解析する肌悩みを選択できます。**[入力と出力](#section/overview/Inputs-and-Outputs)** を参照してください。</br>\n  その後、ファイル ID または画像ファイル URL を指定して POST 'task/skin-analysis'\n  を呼び出すと画質改善タスクが実行され、***task_id*** が取得されます。\n  SD と HD の肌悩みパラメータを同時に使用することは**サポートされていません**。\n\n- **既存の公開画像 URL を使用する**\nアップロードの代わりに、AI タスクの開始時に公開アクセス可能な画像 URL を直接指定できます。\n\n**レスポンス例：**\n\n```json\n{\n  \"status\": 200,\n  \"data\": {\n    \"task_id\": \"SaGaqpDgKwFrVBgMpQMA3HY0LeqdT9_13W5TOD8_u_GPi6NqQ3dhlmN-6ntFwhzT\"\n  }\n}\n```\n\n***\n\n   * **ステップ 6: タスクステータスをポーリングする**\n\n`task_id` を使用してタスクの結果を取得します：\n\n```bash\ncurl --request GET \\\n  --url https://yce-api-01.makeupar.com/s2s/v2.0/task/skin-analysis/<YOUR_TASK_ID> \\\n  --header 'Authorization: Bearer YOUR_API_KEY' \\\n  --header 'Content-Type: application/json'\n```\nこの ***task_id*** は、GET 'task/skin-analysis' をポーリングして現在のエンジンステータスを取得し、タスクのステータスを監視するために使用します。エンジンがタスクを完了するまでステータスは 'running' のままとなり、この段階ではユニットは消費されません。\n\n処理された結果は完了後 24 時間保持されます。- 短い間隔でポーリングする必要はありません。- 24 時間以内の範囲であればポーリング間隔は柔軟に設定できます。\n\n  > **重要:** 実行時間は保証されないため、タスクステータスを確認するには引き続きポーリングが必要です。\n\nエンジンが入力ファイルの処理に成功し、結果画像を生成すると、タスクは 'success' ステータスに変わります。処理済み画像の URL と dst_id が取得され、結果画像を再アップロードせずに別の AI タスクを連鎖して実行できます。\n\nユニットが消費されるのはこの場合のみです。エンジンがタスクの処理に失敗すると、タスクのステータスは 'error' に変わり、ユニットは消費されません。\nユニットを減算する際、システムは有効期限が近いものを優先します。有効期限が同じ場合は、最も早く取得したユニットから減算されます。\n\n\n***\n\n   * **ステップ 7: 結果を解釈する**\n\nレスポンスには以下が含まれます：\n\n*   `ui_score` – ユーザー向けのスコア。\n*   `raw_score` – 解析の生スコア。\n*   `mask_urls` – 検出マスクの URL。\n\n**レスポンス例：**\n\n```json\n{\n  \"status\": 200,\n  \"data\": {\n    \"results\": {\n      \"output\": [\n        {\n          \"type\": \"texture\",\n          \"ui_score\": 68,\n          \"raw_score\": 57.33,\n          \"mask_urls\": [\"https://yce-us.s3-accelerate.amazonaws.com/...texture_output.jpg\"]\n        },\n        {\n          \"type\": \"pore\",\n          \"ui_score\": 92,\n          \"raw_score\": 95.34,\n          \"mask_urls\": [\"https://yce-us.s3-accelerate.amazonaws.com/...pore_output.jpg\"]\n        }\n        // Additional results omitted for brevity\n      ]\n    },\n    \"task_status\": \"success\"\n  }\n}\n```\n\n\n* デバッグガイド\n> **警告:** SD と HD の肌悩みパラメータを同時に使用することは**サポートされていません**。これらの仕様に違反する操作を行うと ***InvalidParameters*** エラーが発生します。\n\n  * HD と SD の肌悩みを混在して使用すると、次のようなエラーが発生します：\n    ```json\n    {\n        \"status\": 400,\n        \"error\": \"cannot mix HD and SD dst_actions\",\n        \"error_code\": \"InvalidParameters\"\n    }\n    ```\n  * 肌悩みをスペルミスした場合、または不明な肌悩みを送信した場合、次のようなエラーが発生します：\n    ```json\n    {\n        \"status\": 400,\n        \"error\": \"Not available dst_action abc123\",\n        \"error_code\": \"InvalidParameters\"\n    }\n    ```\n\n---\n\n* 実際の活用例：\n![](https://plugins-media.makeupar.com/webconsultation/images/skincare-widget/img_webcm_skincare_service_survey_demo.jpg)\n![](https://bcw-media.s3.ap-northeast-1.amazonaws.com/skin_analysis_s5_poster_3_dt_85efe14952.png)\n![](https://bcw-media.s3.ap-northeast-1.amazonaws.com/Skincare_Pro_Medspa_Situation_Image_6aea6046f9.jpg)\n## 入力と出力 (Inputs & Outputs)\n* 入力パラメータの説明\nAI 肌分析 (AI Skin Analysis) の結果の視覚的な出力を制御する方法は 2 つあります。複数の画像を生成して各肌悩みをそれぞれ独立したマスクとして表示する方法と、``enable_mask_overlay`` パラメータを使用してブレンドされた 1 枚の画像を生成する方法のいずれかを選択できます。初期設定ではシステムが複数のマスクを出力するため、各肌悩みのマスクを画像とどのようにブレンドするかを完全に制御できます。\n\n* 初期値: enable_mask_overlay false\n  ![](https://bcw-media.s3.ap-northeast-1.amazonaws.com/strapi/assets/mask_overlay_false_1920_ea1cde0ead.png)\n\n* enable_mask_overlay を true に設定\n  ![](https://bcw-media.s3.ap-northeast-1.amazonaws.com/strapi/assets/mask_overlay_1920_0fbb4786cc.png)\n\n----\n\n* 出力 ZIP のデータ構造の説明\nシステムは ZIP ファイルを提供し、その内部に 'skinanalysisResult' フォルダが含まれています。このフォルダには、すべての検出スコアと結果画像への参照を含む 'score_info.json' ファイルが格納されています。\n\n'score_info.json' ファイルには、すべての肌診断の検出結果が、数値のスコアと対応する出力マスクファイル名とともに含まれています。\n\nPNG ファイルは、元の画像にオーバーレイできる検出結果のマスクです。これらの PNG ファイルのアルファ値を使って元の画像とブレンドするだけで、検出結果を元画像上で直接確認できます。\n\n* 肌診断結果 ZIP 内のファイル構成\n* HD Skincare ZIP\n  * skinanalysisResult\n    - score_info.json\n    - hd_acne_output.png\n    - hd_age_spot_output.png\n    - hd_dark_circle_output.png\n    - hd_droopy_lower_eyelid_output.png\n    - hd_droopy_upper_eyelid_output.png\n    - hd_eye_bag_output.png\n    - hd_firmness_output.png\n    - hd_moisture_output.png\n    - hd_oiliness_output.png\n    - hd_radiance_output.png\n    - hd_redness_output.png\n    - hd_texture_output.png\n    - hd_pore_output_all.png\n    - hd_pore_output_cheek.png\n    - hd_pore_output_forehead.png\n    - hd_pore_output_nose.png\n    - hd_wrinkle_output_all.png\n    - hd_wrinkle_output_crowfeet.png\n    - hd_wrinkle_output_forehead.png\n    - hd_wrinkle_output_glabellar.png\n    - hd_wrinkle_output_marionette.png\n    - hd_wrinkle_output_nasolabial.png\n    - hd_wrinkle_output_periocular.png\n    - hd_tear_trough.png\n    - hd_skin_type.png\n\n* SD Skincare ZIP\n  * skinanalysisResult\n    - score_info.json\n    - acne_output.png\n    - age_spot_output.png\n    - dark_circle_v2_output.png\n    - droopy_lower_eyelid_output.png\n    - droopy_upper_eyelid_output.png\n    - eye_bag_output.png\n    - firmness_output.png\n    - moisture_output.png\n    - oiliness_output.png\n    - pore_output.png\n    - radiance_output.png\n    - redness_output.png\n    - texture_output.png\n    - wrinkle_output.png\n    - tear_trough.png\n    - skin_type.png\n\n* JSON データ構造 (score_info.json)\n  * \"all\": 1 から 100 の範囲の浮動小数点値で、一般的な肌状態を表します。スコアが高いほど、より健康で美しさに優れた肌状態であることを示します。\n  * \"skin_age\": すべての年齢層にわたる一般母集団の分布に対する、AI が算出した肌年齢。\n  * 各カテゴリには以下が含まれます:\n    * \"raw_score\": 1 から 100 の範囲の浮動小数点値。スコアが高いほど、より健康で美しさに優れた肌状態であることを示します。\n    * \"ui_score\": 1 から 100 の範囲の整数。UI Score は主に美容評価において心理的なモチベーションの向上として機能します。消費者は一般的に自身の肌状態について肯定的な評価を好むことを踏まえ、より好ましい結果となるよう raw スコアを調整しています。このキャリブレーションは、根底にある美容心理学の枠組みを維持しつつ、ユーザーにより大きな自信を持っていただくことを目的としています。\n    * \"output_mask_name\": 対応する出力マスク画像のファイル名。\n\n  * カテゴリと説明\n    * HD Skincare:\n        * \"hd_redness\": 肌の赤みの深刻度を測定します。\n        * \"hd_oiliness\": 肌の皮脂レベルを判定します。\n        * \"hd_age_spot\": 老人斑と色素沈着を検出します。\n        * \"hd_radiance\": 肌の輝きを評価します。\n        * \"hd_moisture\": 肌の水分量を評価します。\n        * \"hd_dark_circle\": 目の下のクマの有無を解析します。\n        * \"hd_eye_bag\": 目元のたるみを検出します。\n        * \"hd_droopy_upper_eyelid\": 上まぶたの下垂の深刻度を測定します。\n        * \"hd_droopy_lower_eyelid\": 下まぶたの下垂の深刻度を測定します。\n        * \"hd_firmness\": 肌のハリと弾力を評価します。\n        * \"hd_texture\": Subcategories[whole]; 肌全体のキメを解析します。\n        * \"hd_acne\": Subcategories[whole]; にきりの有無を検出します。\n        * \"hd_pore\": Subcategories[forehead, nose, cheek, whole]; 異なる顔領域の毛穴を検出し、評価します。\n        * \"hd_wrinkle\": Subcategories[forehead, glabellar, crowfeet, periocular, nasolabial, marionette, whole]; さまざまな顔領域におけるしわの深刻度を測定します。\n        * \"hd_tear_trough\": 涙溝を検出します。\n        * \"hd_skin_type\": Subcategories[whole, t_zone, u_zone] Normal、Oily、Dry、Combination、Redness、Dry & Redness、Oily & Redness、Combination & Redness のいずれかの肌タイプを評価します。\n\n    * SD Skincare:\n        * \"wrinkle\": しわに関する一般的な解析。\n        * \"droopy_upper_eyelid\": 上まぶたの下垂の深刻度を測定します。\n        * \"droopy_lower_eyelid\": 下まぶたの下垂の深刻度を測定します。\n        * \"firmness\": 肌のハリと弾力を評価します。\n        * \"acne\": にきりの有無を評価します。\n        * \"moisture\": 肌の水分量を測定します。\n        * \"eye_bag\": 目元のたるみを検出します。\n        * \"dark_circle_v2\": 別の方法を用いてクマを解析します。\n        * \"age_spot\": 老人斑を検出します。\n        * \"radiance\": 肌の明るさを評価します。\n        * \"redness\": 肌の赤みを測定します。\n        * \"oiliness\": 肌の皮脂レベルを判定します。\n        * \"pore\": 毛穴の目立ち度を測定します。\n        * \"texture\": 肌全体のキメを解析します。\n        * \"tear_trough\": 涙溝を検出します。\n        * \"skin_type\": Subcategories[whole, t_zone, u_zone] Normal、Oily、Dry、Combination、Redness、Dry & Redness、Oily & Redness、Combination & Redness のいずれかの肌タイプを評価します。\n\n  * HD Skincare の score_info.json の例\n    ```json\n    {\n        \"hd_redness\": {\n            \"raw_score\": 72.011962890625,\n            \"ui_score\": 77,\n            \"output_mask_name\": \"hd_redness_output.png\"\n        },\n        \"hd_oiliness\": {\n            \"raw_score\": 60.74365234375,\n            \"ui_score\": 72,\n            \"output_mask_name\": \"hd_oiliness_output.png\"\n        },\n        \"hd_age_spot\": {\n            \"raw_score\": 83.23274230957031,\n            \"ui_score\": 77,\n            \"output_mask_name\": \"hd_age_spot_output.png\"\n        },\n        \"hd_radiance\": {\n            \"raw_score\": 76.57244205474854,\n            \"ui_score\": 79,\n            \"output_mask_name\": \"hd_radiance_output.png\"\n        },\n        \"hd_moisture\": {\n            \"raw_score\": 48.694559931755066,\n            \"ui_score\": 70,\n            \"output_mask_name\": \"hd_moisture_output.png\"\n        },\n        \"hd_dark_circle\": {\n            \"raw_score\": 80.1993191242218,\n            \"ui_score\": 76,\n            \"output_mask_name\": \"hd_dark_circle_output.png\"\n        },\n        \"hd_eye_bag\": {\n            \"raw_score\": 76.67280435562134,\n            \"ui_score\": 79,\n            \"output_mask_name\": \"hd_eye_bag_output.png\"\n        },\n        \"hd_droopy_upper_eyelid\": {\n            \"raw_score\": 79.05348539352417,\n            \"ui_score\": 80,\n            \"output_mask_name\": \"hd_droopy_upper_eyelid_output.png\"\n        },\n        \"hd_droopy_lower_eyelid\": {\n            \"raw_score\": 79.97175455093384,\n            \"ui_score\": 81,\n            \"output_mask_name\": \"hd_droopy_lower_eyelid_output.png\"\n        },\n        \"hd_firmness\": {\n            \"raw_score\": 89.66898322105408,\n            \"ui_score\": 85,\n            \"output_mask_name\": \"hd_firmness_output.png\"\n        },\n        \"hd_texture\": {\n            \"whole\": {\n                \"raw_score\": 66.3921568627451,\n                \"ui_score\": 75,\n                \"output_mask_name\": \"hd_texture_output.png\"\n            }\n        },\n        \"hd_acne\": {\n            \"whole\": {\n                \"raw_score\": 59.92677688598633,\n                \"ui_score\": 76,\n                \"output_mask_name\": \"hd_acne_output.png\"\n            }\n        },\n        \"hd_pore\": {\n            \"forehead\": {\n                \"raw_score\": 79.59770965576172,\n                \"ui_score\": 80,\n                \"output_mask_name\": \"hd_pore_output_forehead.png\"\n            },\n            \"nose\": {\n                \"raw_score\": 29.139814376831055,\n                \"ui_score\": 58,\n                \"output_mask_name\": \"hd_pore_output_nose.png\"\n            },\n            \"cheek\": {\n                \"raw_score\": 44.11081314086914,\n                \"ui_score\": 65,\n                \"output_mask_name\": \"hd_pore_output_cheek.png\"\n            },\n            \"whole\": {\n                \"raw_score\": 49.23978805541992,\n                \"ui_score\": 67,\n                \"output_mask_name\": \"hd_pore_output_all.png\"\n            }\n        },\n        \"hd_wrinkle\": {\n            \"forehead\": {\n                \"raw_score\": 55.96956729888916,\n                \"ui_score\": 67,\n                \"output_mask_name\": \"hd_wrinkle_output_forehead.png\"\n            },\n            \"glabellar\": {\n                \"raw_score\": 76.7251181602478,\n                \"ui_score\": 75,\n                \"output_mask_name\": \"hd_wrinkle_output_glabellar.png\"\n            },\n            \"crowfeet\": {\n                \"raw_score\": 83.4361481666565,\n                \"ui_score\": 78,\n                \"output_mask_name\": \"hd_wrinkle_output_crowfeet.png\"\n            },\n            \"periocular\": {\n                \"raw_score\": 67.88706302642822,\n                \"ui_score\": 72,\n                \"output_mask_name\": \"hd_wrinkle_output_periocular.png\"\n            },\n            \"nasolabial\": {\n                \"raw_score\": 74.03312683105469,\n                \"ui_score\": 74,\n                \"output_mask_name\": \"hd_wrinkle_output_nasolabial.png\"\n            },\n            \"marionette\": {\n                \"raw_score\": 71.94477319717407,\n                \"ui_score\": 73,\n                \"output_mask_name\": \"hd_wrinkle_output_marionette.png\"\n            },\n            \"whole\": {\n                \"raw_score\": 49.64699745178223,\n                \"ui_score\": 65,\n                \"output_mask_name\": \"hd_wrinkle_output_all.png\"\n            }\n        },\n        \"all\": {\n            \"score\": 75.75757575757575\n        },\n        \"skin_age\": 37\n    }\n    ```\n  * SD Skincare の score_info.json の例\n    ```json\n    {\n        \"wrinkle\": {\n            \"raw_score\": 36.09360456466675,\n            \"ui_score\": 60,\n            \"output_mask_name\": \"wrinkle_output.png\"\n        },\n        \"droopy_upper_eyelid\": {\n            \"raw_score\": 79.05348539352417,\n            \"ui_score\": 80,\n            \"output_mask_name\": \"droopy_upper_eyelid_output.png\"\n        },\n        \"droopy_lower_eyelid\": {\n            \"raw_score\": 79.97175455093384,\n            \"ui_score\": 81,\n            \"output_mask_name\": \"droopy_lower_eyelid_output.png\"\n        },\n        \"firmness\": {\n            \"raw_score\": 89.66898322105408,\n            \"ui_score\": 85,\n            \"output_mask_name\": \"firmness_output.png\"\n        },\n        \"acne\": {\n            \"raw_score\": 92.29713000000001,\n            \"ui_score\": 88,\n            \"output_mask_name\": \"acne_output.png\"\n        },\n        \"moisture\": {\n            \"raw_score\": 48.694559931755066,\n            \"ui_score\": 70,\n            \"output_mask_name\": \"moisture_output.png\"\n        },\n        \"eye_bag\": {\n            \"raw_score\": 76.67280435562134,\n            \"ui_score\": 79,\n            \"output_mask_name\": \"eye_bag_output.png\"\n        },\n        \"dark_circle_v2\": {\n            \"raw_score\": 80.1993191242218,\n            \"ui_score\": 76,\n            \"output_mask_name\": \"dark_circle_v2_output.png\"\n        },\n        \"age_spot\": {\n            \"raw_score\": 83.23274230957031,\n            \"ui_score\": 77,\n            \"output_mask_name\": \"age_spot_output.png\"\n        },\n        \"radiance\": {\n            \"raw_score\": 76.57244205474854,\n            \"ui_score\": 79,\n            \"output_mask_name\": \"radiance_output.png\"\n        },\n        \"redness\": {\n            \"raw_score\": 72.011962890625,\n            \"ui_score\": 77,\n            \"output_mask_name\": \"redness_output.png\"\n        },\n        \"oiliness\": {\n            \"raw_score\": 60.74365234375,\n            \"ui_score\": 72,\n            \"output_mask_name\": \"oiliness_output.png\"\n        },\n        \"pore\": {\n            \"raw_score\": 88.38014125823975,\n            \"ui_score\": 84,\n            \"output_mask_name\": \"pore_output.png\"\n        },\n        \"texture\": {\n            \"raw_score\": 80.09742498397827,\n            \"ui_score\": 76,\n            \"output_mask_name\": \"texture_output.png\"\n        },\n        \"all\": {\n            \"score\": 75.75757575757575\n        },\n        \"skin_age\": 37\n    }\n    ```\n<a id=\"section/overview/File-Specs-and-Errors\"></a>\n## ファイル仕様とエラー (File Specs and Errors)\n* 対応しているファイル形式と解像度\n\n| AI 機能 | 対応解像度 | 対応ファイルサイズ | 対応フォーマット |\n| ---- | ---- | ---- | ---- |\n| SD スキンケア | 短辺の長さは最低 480 ピクセル以上である必要があります。<br>長辺に上限はありませんが、2560 ピクセルを超える場合、システムにより自動的に 2560 ピクセルへリサイズされます。 | < 10MB | jpg/jpeg/png |\n| HD スキンケア | 短辺の長さは最低 1080 ピクセル以上である必要があります。<br>長辺に制限はありませんが、2560 ピクセルを超える場合、自動的に 2560 ピクセルへリサイズされます。 |< 10MB | jpg/jpeg/png |\n\n> **警告:** API では画像が自動的に最大 2560 ピクセルにリサイズされますが、すべての顔にはっきりとピントが合っていること、画像の品質が高いこと、照明が均一であること、顔のサイズが十分に大きく、カメラの正面を向いていることを、お客様ご自身の責任でご確認ください。AI 肌分析 (AI Skin Analysis) を実行する前に HD または SD のスキンケア画像を撮影する際は、被写体ブレと遮蔽を避けてください。最適な結果を得るには、横位置よりも縦位置のアスペクト比の使用を推奨します。\n\n* 撮影方法の推奨事項:\n![](https://bcw-media.s3.ap-northeast-1.amazonaws.com/strapi/assets/webp_AI%20Skin%20Analysis_camera_f93315b088.png)\n\n* 肌診断を開始する準備ガイド\n* 眼鏡を外し、前髪が額にかかっていないことを確認してください\n* 明るい環境であることを確認してください\n* より正確な結果を得るためにメイクを落としてください\n* カメラをまっすぐ見つめ、顔を中央に保ってください\n\n* 写真の要件\n画像の品質を確認し、AI 肌分析に適しているかどうかを判断します。顔が画像の幅の約 60–80% を占め、オーバーレイや遮蔽物がないようにしてください。照明は明るく均一に分配し、露出オーバーや白飛びを避けてください。姿勢は正面を向き、自然でリラックスした状態とし、口を閉じて目を開けてください。\n\n額が完全に見えるようにし、最良の品質を確保するため、前髪を後ろにとかすか髪を結んでください。AI 肌分析の性能を最適化するには眼鏡を外すことを推奨しますが、必須ではありません。\n> **警告:** 顔の幅は画像の幅の 60% より大きい必要があります。\n\n![](https://bcw-media.s3.ap-northeast-1.amazonaws.com/strapi/assets/webp_AI%20Skin%20Analysis_error_src_face_too_small_cr_725792a7fb.png)\n\n\n* エラーコード\n\n|エラーコード|説明|\n|  ----  | ----  |\n|error_below_min_image_size|入力画像の解像度が小さすぎます|\n|error_exceed_max_image_size|入力画像の解像度が大きすぎます|\n|error_src_face_too_small|アップロードされた画像内の顔の領域が小さすぎます。顔の幅は画像の幅の 60% より大きい必要があります。|\n|error_src_face_out_of_bound|アップロードされた画像内の顔の領域が範囲外です|\n|error_lighting_dark|アップロードされた画像の照明が暗すぎます|\n\n* 環境と依存関係\n\n| サンプルコード言語 / ツール | 推奨ランタイムバージョン |\n|---|---|\n| cURL | - bash >= 3.2</br>   - curl >= 7.58 (モダンな TLS/HTTP サポート)</br>   - jq >= 1.6 (堅牢な JSON パース) |\n| Node.js (JavaScript) | Node >= 18 (global fetch を使用するため) |\n| JavaScript | - Chrome / Edge >= 80</br>   - Firefox >= 74</br>   - Safari >= 13.1 |\n| PHP | PHP >= 7.4 (モダンな TLS/互換性のため)、ext-curl (推奨) または allow_url_fopen=On + ext-openssl、ext-json |\n| Python | Python >= 3.10 (f-string を使用するため)、requests >= 2.20.0 |\n| Java | Java 11+ (HttpClient を使用するため)、Jackson Databind >= 2.12.0 |\n\n---\n\n## JS Camera Kit\n{% partial file=\"/_partials/js-camera-kit.md\" /%}\n\n---\n\n## Mobile Camera Kit\n{% partial file=\"/_partials/mobile-camera-kit.md\" /%}\n\n---\n\n## ユニット消費量\n\n* AI 肌分析 (AI Skin Analysis) (V2.0, 2.1)\n\n| AI 機能 | 消費ユニット数 |\n|---|---|\n| 1~4 項目の肌悩み解析 | SD は 9 ユニット、HD は 12 ユニット | \n| 5~8 項目の肌悩み解析 | SD は 12 ユニット、HD は 16 ユニット |\n| 9~12 項目の肌悩み解析 | SD は 14 ユニット、HD は 20 ユニット |\n| 13~16 項目の肌悩み解析 | SD は 16 ユニット、HD は 22 ユニット |\n\n---\n",
    "version": "",
    "termsOfService": "https://www.makeupar.com/perfectbeauty/youcam/terms-of-service-api",
    "contact": {
      "email": "YouCamOnlineEditor_API@perfectcorp.com"
    },
    "license": {
      "name": "Privacy policy",
      "url": "https://www.makeupar.com/perfectbeauty/youcam/privacy-policy-api"
    }
  },
  "servers": [
    {
      "url": "https://yce-api-01.makeupar.com"
    }
  ],
  "tags": [
    {
      "name": "V2.1",
      "description": "Skin Analysis API v2.1 では、更新された AI エンジンを導入し、スキンケア出力の最大解像度を 2560 ピクセルまで引き上げ、入力画像の自動リサイズに対応しました。"
    },
    {
      "name": "V2.0",
      "description": "AI スキンケア分析で、質感、色素沈着、水分量、毛穴サイズなど、肌のさまざまな側面を分析します。"
    }
  ],
  "paths": {
    "/s2s/v2.0/task/skin-analysis": {
      "post": {
        "summary": "AI 肌分析タスクを実行します。",
        "description": "AI タスクは非同期です。機能ごとに Webhook がサポートされている場合は、Webhook による完了処理を優先します。Webhook エンドポイントを設定し、Webhook 署名を検証したうえで、`success` または `error` の通知が来たら、受け取った `task_id` を使ってタスクの結果を照会します。設定と検証の詳細は [Webhook 統合ガイド](../develop/webhook.md) を参照してください。\n\nWebhook がサポートされていない場合、または統合に使えない場合は、ポーリングを実装します。AI タスクを送信した後、一定の間隔（例：10 秒ごと）でステータスエンドポイントをポーリングし、`success` または `error` になるまで待ちます。\n",
        "tags": [
          "V2.0"
        ],
        "security": [
          {
            "BearerAuthenticationV2": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RunSkincareTaskV2"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "AI 肌分析タスクの実行に成功しました",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BasicRunTaskResponseV2"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/RunError"
          },
          "401": {
            "$ref": "#/components/responses/InvalidApiKey"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/s2s/v2.0/task/skin-analysis/{task_id}": {
      "get": {
        "summary": "AI 肌分析タスクのステータスを確認します。",
        "description": "AI タスクは非同期です。機能ごとに Webhook がサポートされている場合は、Webhook による完了処理を優先します。Webhook エンドポイントを設定し、Webhook 署名を検証したうえで、`success` または `error` の通知が来たら、受け取った `task_id` を使ってタスクの結果を照会します。設定と検証の詳細は [Webhook 統合ガイド](../develop/webhook.md) を参照してください。\n\nWebhook がサポートされていない場合、または統合に使えない場合は、ポーリングを実装します。AI タスクを送信した後、一定の間隔（例：10 秒ごと）でステータスエンドポイントをポーリングし、`success` または `error` になるまで待ちます。\n",
        "tags": [
          "V2.0"
        ],
        "security": [
          {
            "BearerAuthenticationV2": []
          }
        ],
        "parameters": [
          {
            "name": "task_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "example": "grH0CvsgXuAIHLUzD0V1Ol34hoet3R1tvdbtiVHrDb6_UqCLKIejAIajwxrhOAfe"
            },
            "description": "確認するタスクの ID"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/SkinAnalysisResponse"
          },
          "400": {
            "$ref": "#/components/responses/InvalidTaskId"
          },
          "401": {
            "$ref": "#/components/responses/InvalidApiKey"
          },
          "500": {
            "$ref": "#/components/responses/TaskTimeout"
          }
        }
      }
    },
    "/s2s/v2.1/task/skin-analysis": {
      "post": {
        "summary": "AI 肌分析 V2.1 タスクを実行します。",
        "description": "AI タスクは非同期です。機能ごとに Webhook がサポートされている場合は、Webhook による完了処理を優先します。Webhook エンドポイントを設定し、Webhook 署名を検証したうえで、`success` または `error` の通知が来たら、受け取った `task_id` を使ってタスクの結果を照会します。設定と検証の詳細は [Webhook 統合ガイド](../develop/webhook.md) を参照してください。\n\nWebhook がサポートされていない場合、または統合に使えない場合は、ポーリングを実装します。AI タスクを送信した後、一定の間隔（例：10 秒ごと）でステータスエンドポイントをポーリングし、`success` または `error` になるまで待ちます。\n",
        "tags": [
          "V2.1"
        ],
        "security": [
          {
            "BearerAuthenticationV2": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "allOf": [
                  {
                    "$ref": "#/components/schemas/RunSkincareTaskV2"
                  },
                  {
                    "type": "object",
                    "properties": {
                      "pf_camera_kit": {
                        "type": "boolean",
                        "example": true
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "AI 肌分析タスクの実行に成功しました",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BasicRunTaskResponseV2"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/RunError"
          },
          "401": {
            "$ref": "#/components/responses/InvalidApiKey"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/s2s/v2.1/task/skin-analysis/{task_id}": {
      "get": {
        "summary": "AI 肌分析 V2.1 タスクのステータスを確認します。",
        "description": "AI タスクは非同期です。機能ごとに Webhook がサポートされている場合は、Webhook による完了処理を優先します。Webhook エンドポイントを設定し、Webhook 署名を検証したうえで、`success` または `error` の通知が来たら、受け取った `task_id` を使ってタスクの結果を照会します。設定と検証の詳細は [Webhook 統合ガイド](../develop/webhook.md) を参照してください。\n\nWebhook がサポートされていない場合、または統合に使えない場合は、ポーリングを実装します。AI タスクを送信した後、一定の間隔（例：10 秒ごと）でステータスエンドポイントをポーリングし、`success` または `error` になるまで待ちます。\n",
        "tags": [
          "V2.1"
        ],
        "security": [
          {
            "BearerAuthenticationV2": []
          }
        ],
        "parameters": [
          {
            "name": "task_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "example": "grH0CvsgXuAIHLUzD0V1Ol34hoet3R1tvdbtiVHrDb6_UqCLKIejAIajwxrhOAfe"
            },
            "description": "確認するタスクの ID"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/SkinAnalysisResponse"
          },
          "400": {
            "$ref": "#/components/responses/InvalidTaskId"
          },
          "401": {
            "$ref": "#/components/responses/InvalidApiKey"
          },
          "500": {
            "$ref": "#/components/responses/TaskTimeout"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "BearerAuthenticationV2": {
        "type": "http",
        "scheme": "bearer",
        "description": "標準の 'Bearer authentication' を使用します。ヘッダーに 'API Key' を設定してください: `Authorization:Bearer YOUR_API_KEY`。'Bearer' と 'YOUR_API_KEY' の間にスペースがある点にご注意ください。"
      }
    },
    "schemas": {
      "RunSkincareTaskV2": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BasicRunTaskV2"
          },
          {
            "title": "RunSkincareTaskV2",
            "description": "このオブジェクトは、AI 肌分析タスクの実行を表します。",
            "type": "object",
            "properties": {
              "dst_actions": {
                "$ref": "#/components/schemas/RunSkincareTaskDstActions"
              },
              "miniserver_args": {
                "$ref": "#/components/schemas/RunSkincareTaskMiniserverArgs"
              },
              "format": {
                "type": "string",
                "enum": [
                  "json",
                  "zip"
                ],
                "description": "分析結果のレスポンス形式。初期値は 'zip' です。 - `zip`: 結果は、score_info.json とすべての検出結果画像を含む skinanalysisResult フォルダを格納したダウンロード可能な ZIP ファイルとしてパッケージ化されます。レスポンスには ZIP ファイルをダウンロードするための URL が含まれます。 - `json`: 結果は JSON 形式でレスポンスボディに直接返されます。注意: format=json と format=zip でレスポンススキーマが異なります。\n",
                "example": "zip"
              }
            },
            "required": [
              "dst_actions"
            ]
          }
        ]
      },
      "RunSkincareTaskDstActions": {
        "type": "array",
        "description": "AI 肌分析のアクションです。\n機能には HD と SD の 2 種類があります。\n1 つ以上の機能を選択できますが、すべて SD またはすべて HD で選択する必要があります。\n注意: HD 機能と SD 機能を混在させることはできません。\nHD 機能:\n  - hd_redness: 肌の赤みの重症度を測定します。\n  - hd_oiliness: 肌の油分レベルを判定します。\n  - hd_age_spot: 老人斑と色素沈着を検出します。\n  - hd_radiance: 肌の輝度を評価します。\n  - hd_moisture: 肌の水分量を評価します。\n  - hd_dark_circle: 目の下のクマの有無を分析します。\n  - hd_eye_bag: 目の下のたるみ（目袋）を検出します。\n  - hd_droopy_upper_eyelid: 上まぶたのたるみの重症度を測定します。\n  - hd_droopy_lower_eyelid: 下まぶたのたるみの重症度を測定します。\n  - hd_firmness: 肌の弾力性とハリを評価します。\n  - hd_texture: 肌全体の質感を分析します。\n  - hd_acne: ニキビの有無を検出します。\n  - hd_pore: 異なる顔領域（額、鼻、頬、全体）の毛穴を検出し評価します。\n  - hd_wrinkle: 様々な顔領域（額、眉間、目尻、目周り、ほうれい線、マリオネットライン、全体）のしわの重症度を測定します。\n  - hd_tear_trough: 涙袋（ゴルゴライン）を検出します。\n  - hd_skin_type: サブカテゴリー（全体、T ゾーン、U ゾーン）で肌タイプを Normal、Oily、Dry、Combination、Redness、Dry and Redness、Oily and Redness、Combination and Redness のいずれかで評価します。\n\nSD 機能:\n  - wrinkle: 一般的なシワ分析。\n  - droopy_upper_eyelid: 上まぶたのたるみの重症度を測定します。\n  - droopy_lower_eyelid: 下まぶたのたるみの重症度を測定します。\n  - firmness: 肌の弾力性とハリを評価します。\n  - acne: ニキビの有無を評価します。\n  - moisture: 肌の水分量を測定します。\n  - eye_bag: 目の下のたるみ（目袋）を検出します。\n  - dark_circle_v2: クマを分析します。\n  - age_spot: 老人斑を検出します。\n  - radiance: 肌の明るさを評価します。\n  - redness: 肌の赤みを測定します。\n  - oiliness: 肌の油分を判定します。\n  - pore: 毛穴の目立ち度を測定します。\n  - texture: 肌全体の質感を分析します。\n  - tear_trough: 涙袋（ゴルゴライン）を検出します。\n  - skin_type: サブカテゴリー（全体、T ゾーン、U ゾーン）で肌タイプを Normal、Oily、Dry、Combination、Redness、Dry and Redness、Oily and Redness、Combination and Redness のいずれかで評価します。\n",
        "items": {
          "type": "string",
          "enum": [
            "hd_wrinkle",
            "hd_pore",
            "hd_texture",
            "hd_acne",
            "hd_oiliness",
            "hd_radiance",
            "hd_eye_bag",
            "hd_age_spot",
            "hd_dark_circle",
            "hd_droopy_upper_eyelid",
            "hd_droopy_lower_eyelid",
            "hd_firmness",
            "hd_moisture",
            "hd_redness",
            "hd_tear_trough",
            "hd_skin_type",
            "wrinkle",
            "pore",
            "texture",
            "acne",
            "oiliness",
            "radiance",
            "eye_bag",
            "age_spot",
            "dark_circle_v2",
            "droopy_upper_eyelid",
            "droopy_lower_eyelid",
            "firmness",
            "moisture",
            "redness",
            "tear_trough",
            "skin_type"
          ]
        },
        "example": [
          "hd_wrinkle",
          "hd_pore",
          "hd_texture",
          "hd_acne"
        ]
      },
      "RunSkincareTaskMiniserverArgs": {
        "type": "object",
        "properties": {
          "enable_mask_overlay": {
            "type": "boolean",
            "description": "マスクを画像にブレンドするかどうかを制御します。True の場合、オーバーレイされた画像が .jpg で返されます。False の場合、生のマスクが .png で返されます。初期値は false です。<br> すべての出力画像は、長辺の解像度が最大 2560 ピクセルに制限されます。enable_mask_overlay が有効でない場合、入力解像度が 2560 を超えているかを確認し、マスクオーバーレイをクライアント側で適切に処理する必要があります。入力画像の長辺が 2560 ピクセル未満の場合は、元の画像解像度を使用します。それ以外の場合は、2560 ピクセルを使用して表示を設定してください。"
          },
          "enable_dark_background_hd_pore": {
            "type": "boolean",
            "description": "HD 毛穴可視化用の暗い背景を有効にします"
          },
          "color_dark_background_hd_pore": {
            "type": "string",
            "description": "HD 毛穴暗い背景可視化用の色（16 進数形式）",
            "example": "3D3D3D"
          },
          "opacity_dark_background_hd_pore": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "HD 毛穴暗い背景可視化用の不透明度",
            "example": 0.4
          },
          "enable_dark_background_hd_wrinkle": {
            "type": "boolean",
            "description": "HD しわ可視化用の暗い背景を有効にします"
          },
          "color_dark_background_hd_wrinkle": {
            "type": "string",
            "description": "HD しわ暗い背景可視化用の色（16 進数形式）",
            "example": "3D3D3D"
          },
          "opacity_dark_background_hd_wrinkle": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "HD しわ暗い背景可視化用の不透明度",
            "example": 0.4
          }
        }
      },
      "SkinAnalysisResponseV2": {
        "description": "RE",
        "type": "object",
        "properties": {
          "status": {
            "type": "integer",
            "description": "レスポンスステータス",
            "example": 200
          },
          "data": {
            "type": "object",
            "properties": {
              "task_status": {
                "type": "string",
                "enum": [
                  "running",
                  "success",
                  "error"
                ],
                "description": "このタスクのステータス"
              },
              "error": {
                "$ref": "#/components/schemas/EngineErrorCode"
              },
              "error_message": {
                "type": "string",
                "description": "エラーの詳細説明"
              },
              "results": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/SkinAnalysisResultsV2Zip"
                  },
                  {
                    "$ref": "#/components/schemas/SkinAnalysisResultsV2Json"
                  }
                ]
              }
            }
          }
        }
      },
      "SkinAnalysisResultsV2Zip": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "description": "この結果をダウンロードするための URL。有効期間は 2 時間です。返される ZIP ファイルには、すべての検出結果のスコアを含む `score_info.json` ファイルと、すべての検出結果の画像が含まれる `skinanalysisResult` フォルダが入っています。`format` が `zip` の場合のみ利用可能です。",
            "example": "https://example.com/sample-result-url"
          }
        }
      },
      "SkinAnalysisResultsV2Json": {
        "type": "object",
        "required": [
          "output"
        ],
        "properties": {
          "output": {
            "type": "array",
            "description": "JSON 形式でレスポンスボディに直接返される分析結果。`format` が `json` の場合のみ利用可能です。",
            "items": {
              "type": "object",
              "properties": {
                "type": {
                  "type": "string",
                  "description": "AI 肌分析のアクション",
                  "example": "hd_skin_type"
                },
                "region": {
                  "type": "string",
                  "description": "分析が集中する顔の領域",
                  "example": "whole"
                },
                "raw_score": {
                  "type": "number",
                  "description": "1 から 100 の範囲の浮動小数点値。`raw_score` は AI モデルによって直接予測されたスコアを指します",
                  "example": 98.5
                },
                "ui_score": {
                  "type": "integer",
                  "description": "1 から 100 の範囲の整数。`ui_score` は `raw_score` に基づいて調整されたスコアです",
                  "example": 97
                },
                "score": {
                  "type": "number",
                  "description": "一般的な肌状態を表す 1 から 100 の間の浮動小数点値。",
                  "example": 97.66
                },
                "mask_urls": {
                  "type": "array",
                  "description": "分析中に生成されたマスク画像またはリサイズ画像の URL",
                  "items": {
                    "type": "string",
                    "example": "https://example.com/mask_image_1.png"
                  }
                }
              }
            }
          }
        }
      },
      "BasicRunTaskV2SrcFileUrl": {
        "type": "object",
        "required": [
          "src_file_url"
        ],
        "properties": {
          "src_file_url": {
            "type": "string",
            "description": "タスクを実行するファイルの URL。この URL は公開されている必要があります。",
            "example": "https://example.com/selfie.jpg"
          }
        }
      },
      "BasicRunTaskV2SrcFileId": {
        "type": "object",
        "required": [
          "src_file_id"
        ],
        "properties": {
          "src_file_id": {
            "type": "string",
            "description": "タスクを実行するファイルの ID。ファイルアップロード API から取得したファイル ID です。",
            "example": "pfNK5PuRe0MrwLHcGA3DOmB1ahwfXTbYHjv+KoBIxbE="
          }
        }
      },
      "BasicRunTaskV2": {
        "title": "BasicRunTaskV2",
        "anyOf": [
          {
            "title": "src ファイル URL でタスクを実行",
            "allOf": [
              {
                "$ref": "#/components/schemas/BasicRunTaskV2SrcFileUrl"
              }
            ]
          },
          {
            "title": "src ファイル ID でタスクを実行",
            "allOf": [
              {
                "$ref": "#/components/schemas/BasicRunTaskV2SrcFileId"
              }
            ]
          }
        ]
      },
      "BasicRunTaskResponseV2": {
        "type": "object",
        "properties": {
          "status": {
            "type": "integer",
            "description": "レスポンスステータス",
            "example": 200
          },
          "data": {
            "type": "object",
            "properties": {
              "task_id": {
                "type": "string",
                "description": "このタスクの ID。タスクの結果は、この ID を使用して 24 時間以内にクエリできます。",
                "example": "grH0CvsgXuAIHLUzD0V1Ol34hoet3R1tvdbtiVHrDb6_UqCLKIejAIajwxrhOAfe"
              }
            }
          }
        }
      },
      "EngineErrorCode": {
        "type": "string",
        "nullable": true,
        "enum": [
          "error_exceed_max_image_size",
          "exceed_max_filesize",
          "invalid_parameter",
          "error_download_image",
          "error_download_mask",
          "error_decode_image",
          "error_decode_mask",
          "error_nsfw_content_detected",
          "error_no_face",
          "error_pose",
          "error_face_parsing",
          "error_inference",
          "exceed_nsfw_retry_limits",
          "error_upload",
          "unknown_internal_error"
        ],
        "description": "エラー：\n- `error_exceed_max_image_size`  - 入力画像サイズが最大制限を超えています\n- `exceed_max_filesize` - 入力ファイルサイズが最大制限を超えています\n- `invalid_parameter` - 無効なパラメータ値\n- `error_download_image` - ソース画像のダウンロードエラー\n- `error_download_mask` - マスク画像のダウンロードエラー\n- `error_decode_image` - ソース画像のデコードエラー\n- `error_decode_mask` - マスク画像のデコードエラー\n- `error_nsfw_content_detected` - ソース画像で NSFW コンテンツが検出されました\n- `error_no_face` - ソース画像で顔が検出されませんでした\n- `error_pose` - ソース画像でポーズの検出に失敗しました\n- `error_face_parsing` - ソース画像での顔セグメンテーションに失敗しました\n- `error_inference` - 推論パイプラインエラー\n- `exceed_nsfw_retry_limits` - NSFW 画像の生成を避けるための再試行制限を超えました\n- `error_upload` - 結果画像のアップロードエラー\n- `unknown_internal_error` - その他\n"
      }
    },
    "responses": {
      "SkinAnalysisResponse": {
        "description": "AI 肌分析タスクステータスの確認に成功しました",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                {
                  "$ref": "#/components/schemas/SkinAnalysisResponseV2"
                }
              ]
            },
            "examples": {
              "format_zip_success": {
                "summary": "format=zip の場合のレスポンス（成功）",
                "description": "タスクが正常に完了しました。結果は ZIP ファイルとしてパッケージ化されています。",
                "value": {
                  "status": 200,
                  "data": {
                    "task_status": "success",
                    "results": "https://example.com/sample-result-url"
                  }
                }
              },
              "format_json_success": {
                "summary": "format=json の場合のレスポンス（成功）",
                "description": "タスクが正常に完了しました。結果は詳細なスコアと画像 URL を含む JSON として直接返されます。",
                "value": {
                  "status": 200,
                  "data": {
                    "task_status": "success",
                    "results": {
                      "output": [
                        {
                          "type": "hd_wrinkle",
                          "region": "whole",
                          "raw_score": 25.3,
                          "ui_score": 25,
                          "mask_urls": [
                            "https://s3-us-west-2.amazonaws.com/yce-us/results/hd_wrinkle_whole.jpg"
                          ]
                        },
                        {
                          "type": "hd_wrinkle",
                          "region": "forehead",
                          "raw_score": 20.1,
                          "ui_score": 20,
                          "mask_urls": [
                            "https://s3-us-west-2.amazonaws.com/yce-us/results/hd_wrinkle_forehead.jpg"
                          ]
                        },
                        {
                          "type": "hd_wrinkle",
                          "region": "glabellar",
                          "raw_score": 15.8,
                          "ui_score": 16,
                          "mask_urls": [
                            "https://s3-us-west-2.amazonaws.com/yce-us/results/hd_wrinkle_glabellar.jpg"
                          ]
                        },
                        {
                          "type": "hd_wrinkle",
                          "region": "crowfeet",
                          "raw_score": 30.5,
                          "ui_score": 31,
                          "mask_urls": [
                            "https://s3-us-west-2.amazonaws.com/yce-us/results/hd_wrinkle_crowfeet.jpg"
                          ]
                        },
                        {
                          "type": "hd_pore",
                          "region": "whole",
                          "raw_score": 35.2,
                          "ui_score": 35,
                          "mask_urls": [
                            "https://s3-us-west-2.amazonaws.com/yce-us/results/hd_pore_whole.jpg"
                          ]
                        },
                        {
                          "type": "hd_pore",
                          "region": "forehead",
                          "raw_score": 30,
                          "ui_score": 30,
                          "mask_urls": [
                            "https://s3-us-west-2.amazonaws.com/yce-us/results/hd_pore_forehead.jpg"
                          ]
                        },
                        {
                          "type": "hd_pore",
                          "region": "nose",
                          "raw_score": 45.7,
                          "ui_score": 46,
                          "mask_urls": [
                            "https://s3-us-west-2.amazonaws.com/yce-us/results/hd_pore_nose.jpg"
                          ]
                        },
                        {
                          "type": "hd_pore",
                          "region": "cheek",
                          "raw_score": 32.1,
                          "ui_score": 32,
                          "mask_urls": [
                            "https://s3-us-west-2.amazonaws.com/yce-us/results/hd_pore_cheek.jpg"
                          ]
                        },
                        {
                          "type": "hd_acne",
                          "region": "whole",
                          "raw_score": 12.5,
                          "ui_score": 13,
                          "mask_urls": [
                            "https://s3-us-west-2.amazonaws.com/yce-us/results/hd_acne_whole.jpg"
                          ]
                        },
                        {
                          "type": "hd_skin_type",
                          "region": "whole",
                          "skin_type": "Combination",
                          "mask_urls": [
                            "https://s3-us-west-2.amazonaws.com/yce-us/results/hd_skin_type_whole.jpg"
                          ]
                        },
                        {
                          "type": "hd_skin_type",
                          "region": "t_zone",
                          "skin_type": "Oily",
                          "mask_urls": [
                            "https://s3-us-west-2.amazonaws.com/yce-us/results/hd_skin_type_t_zone.jpg"
                          ]
                        },
                        {
                          "type": "hd_skin_type",
                          "region": "u_zone",
                          "skin_type": "Dry & Redness",
                          "mask_urls": [
                            "https://s3-us-west-2.amazonaws.com/yce-us/results/hd_skin_type_u_zone.jpg"
                          ]
                        },
                        {
                          "type": "skin_age",
                          "score": 29
                        },
                        {
                          "type": "all",
                          "score": 28.5
                        },
                        {
                          "type": "resize_image",
                          "mask_urls": [
                            "https://s3-us-west-2.amazonaws.com/yce-us/results/resized_image.jpg"
                          ]
                        }
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      },
      "RunError": {
        "type": "object",
        "properties": {
          "status": {
            "type": "integer",
            "description": "レスポンスステータス",
            "example": 400
          },
          "error": {
            "type": "string",
            "description": "エラーメッセージ",
            "example": "The operation could not be completed"
          },
          "error_code": {
            "type": "string",
            "enum": [
              "InvalidParameters",
              "CreditInsufficiency",
              "InvalidStyleGroup",
              "InvalidStyle",
              "BadRequest"
            ],
            "description": "エラーコード:\n  * InvalidParameters - 無効なリクエストパラメータ\n  * CreditInsufficiency - 実行に必要なユニットが不足しています\n  * BadRequest - 予期しないリクエストパラメータ\n  * InvalidStyleGroup - 無効なスタイルグループ ID\n  * InvalidStyle - 無効なスタイル ID"
          }
        }
      },
      "InvalidApiKey": {
        "description": "無効または欠落している API キー",
        "content": {
          "application/json": {
            "schema": {
              "type": "object",
              "properties": {
                "status": {
                  "type": "integer",
                  "example": 401,
                  "description": "レスポンスステータス"
                },
                "error": {
                  "type": "string",
                  "example": "Invalid API key"
                }
              }
            }
          }
        }
      },
      "TooManyRequests": {
        "description": "リクエストが多すぎます",
        "content": {
          "application/json": {
            "schema": {
              "type": "object",
              "properties": {
                "status": {
                  "type": "integer",
                  "example": 429,
                  "description": "レスポンスステータス"
                },
                "error": {
                  "type": "string",
                  "example": "Too many requests"
                }
              }
            }
          }
        }
      },
      "InvalidTaskId": {
        "description": "無効なタスク ID",
        "content": {
          "application/json": {
            "schema": {
              "type": "object",
              "properties": {
                "status": {
                  "type": "integer",
                  "example": 400,
                  "description": "レスポンスステータス"
                },
                "error": {
                  "type": "string",
                  "example": "Invalid task ID"
                }
              }
            }
          }
        }
      },
      "TaskTimeout": {
        "description": "タスク実行タイムアウト",
        "content": {
          "application/json": {
            "schema": {
              "type": "object",
              "properties": {
                "status": {
                  "type": "integer",
                  "example": 500,
                  "description": "レスポンスステータス"
                },
                "error": {
                  "type": "string",
                  "example": "Task execution timed out"
                }
              }
            }
          }
        }
      }
    }
  }
}