Perfect Corp V2.1 API

Powered by updated AI technology and new style templates, the platform can create new hairstyles, apply specific template‑based looks, and transfer styles from user‑provided reference images.

Operations 8

GET /s2s/v2.1/task/template/hair-transfer List predefined templates v2.1 #
POST /s2s/v2.1/task/hair-transfer Run an AI Hairstyle Generator v2.1 task #
GET /s2s/v2.1/task/hair-transfer/{task_id} Check the status of a AI Hairstyle Generator v2.1 task #
POST /s2s/v2.1/task/skin-analysis Run a Skin Analysis V2.1 task #
GET /s2s/v2.1/task/skin-analysis/{task_id} Check a Skin Analysis V2.1 task status #
POST /s2s/v2.0/file/obj-rem-vid Create a new file #
POST /s2s/v2.0/task/obj-rem-vid Run an AI Video Object Removal task #
GET /s2s/v2.0/task/obj-rem-vid/{task_id} Check the status of a AI Video Object Removal task #

Documentation

Specifications

Other Resources

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/perfect-corp-v2-1-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

perfect-corp-v2-1-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Perfect Corp V2.1 API
  version: ''
  contact:
    email: YouCamOnlineEditor_API@perfectcorp.com
  license:
    name: Privacy policy
    url: https://www.makeupar.com/perfectbeauty/youcam/privacy-policy-api
  termsOfService: https://www.makeupar.com/perfectbeauty/youcam/terms-of-service-api
  description: 'Operations tagged V2.1 across 3 of this provider''s published API definitions: perfect-corp-ai_hairstyle-openapi.yml, perfect-corp-ai_skin_analysis-openapi.yml, perfect-corp-ai_video_object_removal-openapi.yml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://yce-api-01.makeupar.com
tags:
- name: V2.1
  description: Powered by updated AI technology and new style templates, the platform can create new hairstyles, apply specific template‑based looks, and transfer styles from user‑provided reference images.
paths:
  /s2s/v2.1/task/template/hair-transfer:
    get:
      summary: List predefined templates v2.1
      tags:
      - V2.1
      security:
      - BearerAuthenticationV2: []
      parameters:
      - name: page_size
        in: query
        schema:
          type: integer
          example: 20
        description: Number of results to return in this page. Valid value should be between 1 and 20. Default 20.
      - name: starting_token
        in: query
        schema:
          type: string
          example: 73a3c9e69b89
        description: Token for current page. Start with `null` for the first page, and use `next_token` from the previous response to start next page
      responses:
        '200':
          $ref: '#/components/responses/TemplateResponse'
        '400':
          $ref: '#/components/responses/InvalidParameters'
        '401':
          $ref: '#/components/responses/InvalidApiKey'
      operationId: getS2sV21TaskTemplateHairTransfer
      x-operation-id-source: derived
    servers:
    - url: https://yce-api-01.makeupar.com
  /s2s/v2.1/task/hair-transfer:
    post:
      summary: Run an AI Hairstyle Generator v2.1 task
      description: 'AI tasks are asynchronous. Prefer webhook-based completion handling when the feature supports webhooks. Configure your webhook endpoint, verify webhook signatures, and use the received `task_id` to query the task result after a `success` or `error` notification. See the webhook integration guide for setup and verification details.


        If webhooks are not supported for the feature, or if your integration cannot use webhooks, implement polling. After starting an AI task, keep polling the task status endpoint at the given `polling_interval` until the task status is either `success` or `error`.


        Do not stop polling a running task for longer than the allowed polling window. If the task is not polled in time, the task may expire; a later status check can return `InvalidTaskId` even if processing finished, and the consumed units may still be charged.'
      tags:
      - V2.1
      security:
      - BearerAuthenticationV2: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              allOf:
              - $ref: '#/components/schemas/RunHairTransferTaskV2.1'
      responses:
        '200':
          description: Successful execution of the task
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BasicRunTaskResponseV2'
        '400':
          description: Failed execution of task
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/RunError'
        '401':
          $ref: '#/components/responses/InvalidApiKey'
        '429':
          $ref: '#/components/responses/TooManyRequests'
      operationId: postS2sV21TaskHairTransfer
      x-operation-id-source: derived
    servers:
    - url: https://yce-api-01.makeupar.com
  /s2s/v2.1/task/hair-transfer/{task_id}:
    get:
      summary: Check the status of a AI Hairstyle Generator v2.1 task
      tags:
      - V2.1
      security:
      - BearerAuthenticationV2: []
      parameters:
      - name: task_id
        in: path
        required: true
        schema:
          type: string
          example: grH0CvsgXuAIHLUzD0V1Ol34hoet3R1tvdbtiVHrDb6_UqCLKIejAIajwxrhOAfe
        description: ID of task to check
      responses:
        '200':
          description: Successful check of the task status
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskStatusResponseV2'
        '400':
          $ref: '#/components/responses/InvalidTaskId'
        '401':
          $ref: '#/components/responses/InvalidApiKey'
        '500':
          $ref: '#/components/responses/TaskTimeout'
      operationId: getS2sV21TaskHairTransferByTaskId
      x-operation-id-source: derived
    servers:
    - url: https://yce-api-01.makeupar.com
  /s2s/v2.1/task/skin-analysis:
    post:
      summary: Run a Skin Analysis V2.1 task
      description: 'AI tasks are asynchronous. Prefer webhook-based completion handling when the feature supports webhooks. Configure your webhook endpoint, verify webhook signatures, and use the received `task_id` to query the task result after a `success` or `error` notification. See the webhook integration guide for setup and verification details.


        If webhooks are not supported for the feature, or if your integration cannot use webhooks, implement polling. After starting an AI task, keep polling the task status endpoint at the given `polling_interval` until the task status is either `success` or `error`.


        Do not stop polling a running task for longer than the allowed polling window. If the task is not polled in time, the task may expire; a later status check can return `InvalidTaskId` even if processing finished, and the consumed units may still be charged.'
      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: Successful execution of Skin Analysis task
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BasicRunTaskResponseV2'
        '400':
          $ref: '#/components/responses/RunError'
        '401':
          $ref: '#/components/responses/InvalidApiKey'
        '429':
          $ref: '#/components/responses/TooManyRequests'
      operationId: postS2sV21TaskSkinAnalysis
      x-operation-id-source: derived
    servers:
    - url: https://yce-api-01.makeupar.com
  /s2s/v2.1/task/skin-analysis/{task_id}:
    get:
      summary: Check a Skin Analysis V2.1 task status
      description: 'AI tasks are asynchronous. Prefer webhook-based completion handling when the feature supports webhooks. Configure your webhook endpoint, verify webhook signatures, and use the received `task_id` to query the task result after a `success` or `error` notification. See the webhook integration guide for setup and verification details.


        If webhooks are not supported for the feature, or if your integration cannot use webhooks, implement polling. After starting an AI task, keep polling the task status endpoint at the given `polling_interval` until the task status is either `success` or `error`.


        Do not stop polling a running task for longer than the allowed polling window. If the task is not polled in time, the task may expire; a later status check can return `InvalidTaskId` even if processing finished, and the consumed units may still be charged.'
      tags:
      - V2.1
      security:
      - BearerAuthenticationV2: []
      parameters:
      - name: task_id
        in: path
        required: true
        schema:
          type: string
          example: grH0CvsgXuAIHLUzD0V1Ol34hoet3R1tvdbtiVHrDb6_UqCLKIejAIajwxrhOAfe
        description: ID of task to check
      responses:
        '200':
          $ref: '#/components/responses/SkinAnalysisResponse'
        '400':
          $ref: '#/components/responses/InvalidTaskId'
        '401':
          $ref: '#/components/responses/InvalidApiKey'
        '500':
          $ref: '#/components/responses/TaskTimeout'
      operationId: getS2sV21TaskSkinAnalysisByTaskId
      x-operation-id-source: derived
    servers:
    - url: https://yce-api-01.makeupar.com
  /s2s/v2.0/file/obj-rem-vid:
    post:
      summary: Create a new file
      description: To upload a new file, you'll first need to use the File API. It will give you a URL – use that URL to upload your file. Once the upload is finished, you can use the file_id from the same response to start using our AI features.
      tags:
      - V2.1
      security:
      - BearerAuthenticationV2: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              allOf:
              - $ref: '#/components/schemas/VideoFileV1.1'
      responses:
        '200':
          description: Successful retrieval of file upload information
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/VideoFileResponseV2'
        '400':
          $ref: '#/components/responses/InvalidParameters'
        '401':
          $ref: '#/components/responses/InvalidApiKey'
      operationId: postS2sV20FileObjRemVid
      x-operation-id-source: derived
    servers:
    - url: https://yce-api-01.makeupar.com
  /s2s/v2.0/task/obj-rem-vid:
    post:
      summary: Run an AI Video Object Removal task
      description: 'AI tasks are asynchronous. Prefer webhook-based completion handling when the feature supports webhooks. Configure your webhook endpoint, verify webhook signatures, and use the received `task_id` to query the task result after a `success` or `error` notification. See the webhook integration guide for setup and verification details.


        If webhooks are not supported for the feature, or if your integration cannot use webhooks, implement polling. After starting an AI task, keep polling the task status endpoint at the given `polling_interval` until the task status is either `success` or `error`.


        Do not stop polling a running task for longer than the allowed polling window. If the task is not polled in time, the task may expire; a later status check can return `InvalidTaskId` even if processing finished, and the consumed units may still be charged.'
      tags:
      - V2.1
      security:
      - BearerAuthenticationV2: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              allOf:
              - $ref: '#/components/schemas/BasicRunVidTaskV2WithRequiredMsk'
              - type: object
                required:
                - frame_idx
                properties:
                  frame_idx:
                    type: integer
                    description: Specifies the frame index in the input video that corresponds to the provided mask image, ranging from 0 to the total frame count minus 1.
                    example: 0
      responses:
        '200':
          description: Successful execution of the task
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BasicRunTaskResponseV2'
        '400':
          description: Failed execution of task
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/RunError'
        '401':
          $ref: '#/components/responses/InvalidApiKey'
        '429':
          $ref: '#/components/responses/TooManyRequests'
      operationId: postS2sV20TaskObjRemVid
      x-operation-id-source: derived
    servers:
    - url: https://yce-api-01.makeupar.com
  /s2s/v2.0/task/obj-rem-vid/{task_id}:
    get:
      summary: Check the status of a AI Video Object Removal task
      tags:
      - V2.1
      security:
      - BearerAuthenticationV2: []
      parameters:
      - name: task_id
        in: path
        required: true
        schema:
          type: string
          example: grH0CvsgXuAIHLUzD0V1Ol34hoet3R1tvdbtiVHrDb6_UqCLKIejAIajwxrhOAfe
        description: ID of task to check
      responses:
        '200':
          description: Successful check of the task status
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VidTaskStatusResponseV2'
        '400':
          $ref: '#/components/responses/InvalidTaskId'
        '401':
          $ref: '#/components/responses/InvalidApiKey'
        '500':
          $ref: '#/components/responses/TaskTimeout'
      operationId: getS2sV20TaskObjRemVidByTaskId
      x-operation-id-source: derived
    servers:
    - url: https://yce-api-01.makeupar.com
components:
  schemas:
    BasicRunTaskV2RefFileId:
      type: object
      properties:
        ref_file_id:
          type: string
          description: ID of the reference file to run task. File ID from upload file API.
          example: pfNK5PuRe0MrwLHcGA3DOmB1ahwfXTbYHjv+KoBIxbE=
    Template:
      type: object
      properties:
        id:
          type: string
          description: The ID of the template. Use this as \`template_id\` when run task.
          example: good_template_001
        thumb:
          type: string
          description: The thumbnail of style.
        title:
          type: string
          description: The title of the template.
        category_name:
          type: string
          description: The category name of the template.
        keep_users_color:
          type: boolean
          description: Indicates whether the template supports preserving the user's original hair color instead of applying only the template's predefined color.
    RunHairTransferTaskV2.1:
      allOf:
      - title: Provide exactly one of ref_file_id, ref_file_url, or template_id
        not:
          required:
          - ref_file_url
          - template_id
      - title: Provide exactly one of ref_file_id, ref_file_url, or template_id
        not:
          required:
          - ref_file_id
          - template_id
      - anyOf:
        - allOf:
          - title: Run task with src file url & ref file url
            required:
            - ref_file_url
          - $ref: '#/components/schemas/BasicRunTaskV2SrcFileUrl'
          - $ref: '#/components/schemas/BasicRunTaskV2RefFileUrl'
        - allOf:
          - title: Run task with src file url & ref file ID
            required:
            - ref_file_id
          - $ref: '#/components/schemas/BasicRunTaskV2SrcFileUrl'
          - $ref: '#/components/schemas/BasicRunTaskV2RefFileId'
        - allOf:
          - title: Run task with src file ID & ref file url
            required:
            - ref_file_url
          - $ref: '#/components/schemas/BasicRunTaskV2SrcFileId'
          - $ref: '#/components/schemas/BasicRunTaskV2RefFileUrl'
        - allOf:
          - title: Run task with src file ID & ref file ID
            required:
            - ref_file_id
          - $ref: '#/components/schemas/BasicRunTaskV2SrcFileId'
          - $ref: '#/components/schemas/BasicRunTaskV2RefFileId'
        - allOf:
          - title: Run task with src file url and template
          - $ref: '#/components/schemas/BasicRunTaskV2SrcFileUrl'
          - $ref: '#/components/schemas/RunHairTransferTaskV2.1Template'
        - allOf:
          - title: Run task with src file ID and template
          - $ref: '#/components/schemas/BasicRunTaskV2SrcFileId'
          - $ref: '#/components/schemas/RunHairTransferTaskV2.1Template'
    BasicRunTaskV2SrcFileId:
      type: object
      required:
      - src_file_id
      properties:
        src_file_id:
          type: string
          description: ID of file to run task. File ID from upload file API.
          example: pfNK5PuRe0MrwLHcGA3DOmB1ahwfXTbYHjv+KoBIxbE=
    TaskStatusResponseBodySingleUrlResultsV2:
      type: object
      properties:
        url:
          type: string
          description: URL to download this result. Valid for 2 hours
          example: https://example.com/sample-result-url
    BasicRunTaskV2SrcFileUrl:
      type: object
      required:
      - src_file_url
      properties:
        src_file_url:
          type: string
          description: Url of the file to run task. The url should be publicly accessible.
          example: https://example.com/selfie.jpg
    TaskStatusResponseV2:
      type: object
      properties:
        status:
          type: integer
          description: Response status
          example: 200
        data:
          type: object
          properties:
            task_status:
              type: string
              enum:
              - running
              - success
              - error
              description: Status of this task
            error:
              $ref: '#/components/schemas/EngineErrorCode'
            error_message:
              type: string
              description: Detailed description of error
            results: null
      $ref: '#/components/schemas/TaskStatusResponseBodySingleUrlResultsV2'
    BasicRunTaskResponseV2:
      type: object
      properties:
        status:
          type: integer
          description: Response status
          example: 200
        data:
          type: object
          properties:
            task_id:
              type: string
              description: ID of this task. Task result is valid to query by this ID for 24 hours.
              example: grH0CvsgXuAIHLUzD0V1Ol34hoet3R1tvdbtiVHrDb6_UqCLKIejAIajwxrhOAfe
    RunError:
      type: object
      properties:
        status:
          type: integer
          description: Response status
          example: 400
        error:
          type: string
          description: Error message
          example: The operation could not be completed
        error_code:
          type: string
          enum:
          - InvalidParameters
          - CreditInsufficiency
          - InvalidStyleGroup
          - InvalidStyle
          - BadRequest
          description: "Error code:\n  * InvalidParameters - Invalid request parameters\n  * CreditInsufficiency - Insufficient unit to run\n  * BadRequest - Unexpected request parameter\n  * InvalidStyleGroup - Invalid style group id\n  * InvalidStyle - Invalid style id\n"
    BasicRunTaskV2RefFileUrl:
      type: object
      properties:
        ref_file_url:
          type: string
          description: Url of the reference file to run task. The url should be publicly accessible.
          example: https://example.com/accessory.jpg
    RunHairTransferTaskV2.1Template:
      required:
      - template_id
      properties:
        template_id:
          type: string
          description: ID of the template. List predefined templates first, and use the id of a template.
          example: good_template_001
        hair_color:
          type: string
          enum:
          - ref
          - src
          default: ref
          description: Specifies the hair color of the output image (source/reference), default reference color. <br><b>*Applies only to templates where the keep_user_color parameter is true, meaning the user’s original hair color is preserved. When the parameter is false, the template’s predefined color overrides the user’s hair color. Custom reference images always use the hair color from the reference image.</b>
    EngineErrorCode:
      type:
      - string
      - 'null'
      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: 'Errors:

        - \`error_exceed_max_image_size\`  - Input image size exceeds the maximum limit

        - \`exceed_max_filesize\` - Input file size exceeds the maximum limit

        - \`invalid_parameter\` - Invalid parameter value

        - \`error_download_image\` - Download source image error

        - \`error_download_mask\` - Download mask image error

        - \`error_decode_image\` - Decode source image error

        - \`error_decode_mask\` - Decode mask image error

        - \`error_nsfw_content_detected\` - NSFW content detected in source image

        - \`error_no_face\` - No face detected on source image

        - \`error_pose\` - Failed to detect pose on source image

        - \`error_face_parsing\` - Failed to do face segmentation on source image

        - \`error_inference\` - Inference pipeline error

        - \`exceed_nsfw_retry_limits\` - Exceed the retry limits to avoid generated NSFW image

        - \`error_upload\` - Upload result image error

        - \`unknown_internal_error\` - Others

        '
    BasicRunTaskV2:
      title: BasicRunTaskV2
      anyOf:
      - title: Run task with src file url
        allOf:
        - $ref: '#/components/schemas/BasicRunTaskV2SrcFileUrl'
      - title: Run task with src file ID
        allOf:
        - $ref: '#/components/schemas/BasicRunTaskV2SrcFileId'
    SkinAnalysisResultsV2Zip:
      type: object
      required:
      - url
      properties:
        url:
          type: string
          description: URL to download this result. Valid for 2 hours. The returned ZIP file contains a skinanalysisResult folder of a score_info.json file with all detection result scores and images of all detection results. Only available when format is `zip`.
          example: https://example.com/sample-result-url
    SkinAnalysisResultsV2Json:
      type: object
      required:
      - output
      properties:
        output:
          type: array
          description: The analysis result returned directly in the response body as JSON format. Only available when format is `json`.
          items:
            type: object
            properties:
              type:
                type: string
                description: The action of Skin Analysis
                example: hd_skin_type
              region:
                type: string
                description: The region of the face where the analysis is focused
                example: whole
              raw_score:
                type: number
                description: A floating-point value ranging from 1 to 100. The raw_score refers to the score directly predicted by the AI model
                example: 98.5
              ui_score:
                type: integer
                description: An integer ranging from 1 to 100. The ui_score is the adjusted score based on the raw score
                example: 97
              score:
                type: number
                description: A floating-point value between 1 and 100 representing the general skin condition.
                example: 97.66
              mask_urls:
                type: array
                description: The URLs of the mask images or resized images generated during analysis
                items:
                  type: string
                  example: https://example.com/mask_image_1.png
    RunSkincareTaskMiniserverArgs:
      type: object
      properties:
        enable_mask_overlay:
          type: boolean
          description: Controls whether the mask is blended onto the image. True returns the overlaid image as a .jpg. False returns the raw mask as a .png. Default is false. <br> All output images are limited to a maximum long-side resolution of 2560 pixels. If enable_mask_overlay is not enabled, you must verify whether the input resolution exceeds 2560 and handle the mask overlay accordingly on your side. When the input image has a long side below 2560 pixels, use the original image resolution. Otherwise, use 2560 pixels to configure your display.
        enable_dark_background_hd_pore:
          type: boolean
          description: Enable dark background for HD pore visualization
        color_dark_background_hd_pore:
          type: string
          description: Color for HD pore dark background visualization (hex format)
          example: 3D3D3D
        opacity_dark_background_hd_pore:
          type: number
          minimum: 0
          maximum: 1
          description: Opacity for HD pore dark background visualization
          example: 0.4
        enable_dark_background_hd_wrinkle:
          type: boolean
          description: Enable dark background for HD wrinkle visualization
        color_dark_background_hd_wrinkle:
          type: string
          description: Color for HD wrinkle dark background visualization (hex format)
          example: 3D3D3D
        opacity_dark_background_hd_wrinkle:
          type: number
          minimum: 0
          maximum: 1
          description: Opacity for HD wrinkle dark background visualization
          example: 0.4
    SkinAnalysisResponseV2:
      description: RE
      type: object
      properties:
        status:
          type: integer
          description: Response status
          example: 200
        data:
          type: object
          properties:
            task_status:
              type: string
              enum:
              - running
              - success
              - error
              description: Status of this task
            error:
              $ref: '#/components/schemas/EngineErrorCode'
            error_message:
              type: string
              description: Detailed description of error
            results:
              oneOf:
              - $ref: '#/components/schemas/SkinAnalysisResultsV2Zip'
              - $ref: '#/components/schemas/SkinAnalysisResultsV2Json'
    RunSkincareTaskV2:
      allOf:
      - $ref: '#/components/schemas/BasicRunTaskV2'
      - title: RunSkincareTaskV2
        description: This object represents a run Skin Analysis task.
        type: object
        properties:
          dst_actions:
            $ref: '#/components/schemas/RunSkincareTaskDstActions'
          miniserver_args:
            $ref: '#/components/schemas/RunSkincareTaskMiniserverArgs'
          format:
            type: string
            enum:
            - json
            - zip
            description: 'Response format of the analysis results. Default is ''zip''. - `zip`: Results will be packaged as a downloadable ZIP file containing a skinanalysisResult folder with score_info.json and all detection result images. The response will include a URL to download the ZIP file. - `json`: Results will be returned directly in the response body as JSON format. Note: The response schema differs between format=json and format=zip.

              '
            example: zip
        required:
        - dst_actions
    RunSkincareTaskDstActions:
      type: array
      description: "The actions for Skin Analysis.\nThere are 2 types of features: HD and SD.\nYou can choose one or more features, either all in SD or all in HD.\nNote: HD and SD features cannot be mixed.\nHD features:\n  - hd_redness: Measures skin redness severity.\n  - hd_oiliness: Determines skin oiliness level.\n  - hd_age_spot: Detects age spots and pigmentation.\n  - hd_radiance: Evaluates skin radiance.\n  - hd_moisture: Assesses skin hydration levels.\n  - hd_dark_circle: Analyzes the presence of dark circles under the eyes.\n  - hd_eye_bag: Detects eye bags.\n  - hd_droopy_upper_eyelid: Measures upper eyelid drooping severity.\n  - hd_droopy_lower_eyelid: Measures lower eyelid drooping severity.\n  - hd_firmness: Evaluates skin firmness and elasticity.\n  - hd_texture: Analyzes overall skin texture.\n  - hd_acne: Detects acne presence.\n  - hd_pore: Detects and evaluates pores in different facial regions (forehead, nose, cheek, whole).\n  - hd_wrinkle: Measures the severity of wrinkles in various facial areas (forehead, glabellar, crowfeet, periocular, nasolabial, marionette, whole).\n  - hd_tear_trough: Detects tear trough.\n  - hd_skin_type: Subcategories (whole, T-zone, U-zone) evaluate skin type as Normal, Oily, Dry, Combination, Redness, Dry and Redness, Oily and Redness, or Combination and Redness.\n\nSD features:\n  - wrinkle: General wrinkle analysis.\n  - droopy_upper_eyelid: Measures upper eyelid drooping severity.\n  - droopy_lower_eyelid: Measures lower eyelid drooping severity.\n  - firmness: Evaluates skin firmness and elasticity.\n  - acne: Evaluates acne presence.\n  - moisture: Measures skin hydration.\n  - eye_bag: Detects eye bags.\n  - dark_circle_v2: Analyzes dark circles.\n  - age_spot: Detects age spots.\n  - radiance: Evaluates skin brightness.\n  - redness: Measures skin redness.\n  - oiliness: Determines skin oiliness.\n  - pore: Measures pore visibility.\n  - texture: Analyzes overall skin texture.\n  - tear_trough: Detects tear trough.\n  - skin_type: Subcategories (whole, T-zone, U-zone) evaluate skin type as Normal, Oily, Dry, Combination, Redness, Dry and Redness, Oily and Redness, or 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
    VideoFileResponseV2:
      type: object
      properties:
        status:
          type: integer
          example: 200
          description: Response status
        data: null
      $ref: '#/components/schemas/BasicVideoFileResponse'
    VidTaskStatusResponseV2:
      type: object
      properties:
        status:
          type: integer
          description: Response status
          example: 200
        data:
          type: object
          properties:
            task_status:
              type: string
              enum:
              - running
              - success
              - error
              description: Status of this task
            error:
              $ref: '#/components/schemas/EngineErrorCode'
            error_message:
              type: string
              description: Detailed description of error
            results: null
      $ref: '#/components/schemas/VidTaskStatusResponseBodySingleUrlResultsV2'
    VideoFileV1.1:
      title: VideoFile V1.1
      description: This object represents a video file.
      type: object
      required:
      - files
      properties:
        files:
          type: array
          items:
            type: object
            required:
            - content_type
            - file_name
            - file_size
            properties:
              content_type:
                type: string
                example: video/mp4
                description: Content MIME type for this file. Currently available values are listed in the enum.
              file_name:
                type: string
                example: my-selfie.mp4
                description: Name of this file
              file_size:
                type: integer
                example: 50000
                description: Content length for this file in bytes. Should not be larger than 100MB.
    VidTaskStatusResponseBodySingleUrlResultsV2:
      type: object
      properties:
        url:
          type: string
          description: URL to download this result. Valid for 2 hours
          example: https://example.com/sample-result-url
    BasicRunTaskV2VidSrcFileUrl:
      type: object
      required:
      - src_file_url
      properties:
        src_file_url:
          type: string
          description: Url of the file to run task. The url should be publicly accessible.
          example: https://example.com/cat_video

# --- truncated at 32 KB (43 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/perfect-corp/refs/heads/main/openapi/perfect-corp-v2-1-api-openapi.yml