애니메이션 API

사용 가능한 애니메이션을 검색하고 이를 rig가 적용된 캐릭터에 적용하기 위한 endpoint입니다.


POST/openapi/v1/animations

Create an Animation Task

이 엔드포인트를 사용하면 이전에 리깅된 캐릭터에 애니메이션을 적용하는 새 작업을 생성할 수 있습니다 — 애니메이션 라이브러리의 프리셋 액션(action_id), 여러 프리셋 액션을 하나의 파일로 병합한 것(action_ids), 또는 Text to Motion API로 생성한 모션 클립(motion_task_id) 중 하나를 적용할 수 있습니다. 후처리 옵션도 포함됩니다.

파라미터

  • Name
    rig_task_id
    Type
    string
    필수
    Description

    성공적으로 완료된 리깅 작업(POST /openapi/v1/rigging)의 id입니다. 이 작업의 캐릭터가 애니메이션 적용 대상이 됩니다.

  • Name
    action_id
    Type
    integer
    Description

    적용할 프리셋 애니메이션 액션의 식별자입니다. 사용 가능한 애니메이션의 전체 목록은 애니메이션 라이브러리 참조를 확인하세요. action_id, action_ids, motion_task_id 중 정확히 하나만 제공해야 합니다.

  • Name
    action_ids
    Type
    array of integers
    Description

    한 번에 적용할 여러 프리셋 애니메이션 액션으로, 액션당 하나의 애니메이션 클립을 포함하는 단일 파일로 반환됩니다 — 게임 엔진의 상태 머신에서 캐릭터를 구동하는 데 유용합니다. 애니메이션 라이브러리 참조에서 1개에서 10개까지의 action_id 값을 제공하세요. id는 고유해야 합니다. 액션당 3 크레딧이 소요됩니다. action_id, action_ids, motion_task_id 중 정확히 하나만 제공해야 합니다.

    단일 요소로 이루어진 action_ids를 전달하는 것은 해당 값을 action_id로 전달하는 것과 동일합니다.

  • Name
    motion_task_id
    Type
    string
    Description

    프리셋 액션 대신 적용할, 성공적으로 완료된 Text to Motion 작업의 id입니다. 생성된 클립은 리깅된 캐릭터에 리타깃되며 생성 시점의 클립 스냅샷을 사용하므로, 이후 원본 작업이 만료되거나 삭제되어도 이 작업에는 영향이 없습니다. 원본 작업의 애셋은 3일 동안 보관되므로, 만료되기 전에 클립을 적용하세요. 바이페드 리그가 필요합니다. action_id, action_ids, motion_task_id 중 정확히 하나만 제공해야 합니다.

  • Name
    post_process
    Type
    object
    Description

    애니메이션 출력에 대한 선택적 후처리입니다. 생략하면 표준 애니메이션 파일을 받게 됩니다.

다음 경우에만 적용 post_process is set
  • Name
    operation_type
    Type
    string
    필수
    Description

    수행할 작업의 유형입니다. 사용 가능한 값: change_fps, fbx2usdz, extract_armature.

  • Name
    fps
    Type
    integer
    기본값 30
    Description

    목표 프레임 속도입니다. operation_type이 change_fps인 경우에만 적용됩니다. 허용되는 값: 24, 25, 30, 60.

반환 값

응답의 result 속성에는 새로 생성된 애니메이션 작업의 id가 포함됩니다.

실패 모드

  • Name
    400 - Bad Request
    Description

    요청이 허용되지 않았습니다. 일반적인 원인:

    • 파라미터 누락: rig_task_id가 누락되었거나, action_id, action_ids, motion_task_id 중 어느 것도 제공되지 않았습니다.
    • 파라미터 충돌: action_id, action_ids, motion_task_id 중 둘 이상이 제공되었습니다 — 이들은 상호 배타적입니다.
    • 유효하지 않은 리깅 작업: rig_task_id가 유효하지 않거나 실패했거나 존재하지 않는 작업을 가리킵니다.
    • 유효하지 않은 액션 ID: action_id 또는 action_ids의 항목이 유효한 애니메이션에 해당하지 않습니다.
    • 너무 많은 액션: action_ids에 10개를 초과하는 id가 포함되어 있습니다.
    • 중복된 액션: action_ids에 동일한 id가 두 번 이상 포함되어 있습니다.
    • 모션 작업이 준비되지 않음: motion_task_id 작업이 아직 SUCCEEDED 상태가 아닙니다.
    • 지원되지 않는 리그: motion_task_id에는 바이페드 리그가 필요합니다. 쿼드러페드 리그는 거부됩니다.
  • Name
    401 - Unauthorized
    Description

    인증에 실패했습니다. API 키를 확인해 주세요.

  • Name
    402 - Payment Required
    Description

    이 작업을 수행하기에 크레딧이 부족합니다.

  • Name
    404 - Not Found
    Description

    rig_task_id로 지정된 리깅 작업을 찾을 수 없거나, motion_task_id로 지정된 모션 작업을 찾을 수 없거나, 모션 클립이 만료되었습니다(원본 작업 애셋은 3일 동안 보관됩니다).

  • Name
    429 - Too Many Requests
    Description

    속도 제한을 초과했습니다.

Request

POST
/openapi/v1/animations
# Animate a rigged model with required params only
curl https://api.meshy.ai/openapi/v1/animations \
  -X POST \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
    "rig_task_id": "018b314a-a1b5-716d-c222-2f1776f7f579",
    "action_id": 92
  }'

# Apply several preset actions and get one file with one clip per action
curl https://api.meshy.ai/openapi/v1/animations \
  -X POST \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
    "rig_task_id": "018b314a-a1b5-716d-c222-2f1776f7f579",
    "action_ids": [10, 25, 92]
  }'

# Apply a generated Text to Motion clip instead of a preset action
curl https://api.meshy.ai/openapi/v1/animations \
  -X POST \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
    "rig_task_id": "018b314a-a1b5-716d-c222-2f1776f7f579",
    "motion_task_id": "018c425b-b2c6-727e-d333-3c1887i9h791"
  }'

# With post-processing to change FPS
curl https://api.meshy.ai/openapi/v1/animations \
  -X POST \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
    "rig_task_id": "018b314a-a1b5-716d-c222-2f1776f7f579",
    "action_id": 92,
    "post_process": {
      "operation_type": "change_fps",
      "fps": 24
    }
  }'

Response

{
  "result": "018c425b-b2c6-727e-d333-3c1887i9h791"
}

GET/openapi/v1/animations/:id

애니메이션 작업 조회

이 엔드포인트를 사용하면 유효한 작업 id가 주어졌을 때 애니메이션 작업을 조회할 수 있습니다. 어떤 속성이 포함되는지는 애니메이션 작업 객체를 참고하세요.

매개변수

  • Name
    id
    Type
    path
    Description

    조회할 애니메이션 작업의 고유 식별자입니다.

반환값

응답에는 애니메이션 작업 객체가 포함됩니다. 자세한 내용은 애니메이션 작업 객체 섹션을 확인하세요.

Request

GET
/openapi/v1/animations/018c425b-b2c6-727e-d333-3c1887i9h791
curl https://api.meshy.ai/openapi/v1/animations/018c425b-b2c6-727e-d333-3c1887i9h791 
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Response

{
  "id": "018c425b-b2c6-727e-d333-3c1887i9h791",
  "type": "animate",
  "status": "SUCCEEDED",
  "created_at": 1747032440896,
  "progress": 100,
  "started_at": 1747032441210,
  "finished_at": 1747032457530,
  "expires_at": 1747291657530,
  "task_error": {

    "message": ""

  },

  "consumed_credits": 3,
  "result": {
    "animation_glb_url": "https://assets.meshy.ai/0630d47c-84b8-4d37-bc02-69e45d9272c1/tasks/018c425b-b2c6-727e-d333-3c1887i9h791/output/Animation_Reaping_Swing_withSkin.glb?Expires=...",
    "animation_fbx_url": "https://assets.meshy.ai/0630d47c-84b8-4d37-bc02-69e45d9272c1/tasks/018c425b-b2c6-727e-d333-3c1887i9h791/output/Animation_Reaping_Swing_withSkin.fbx?Expires=...",
    "processed_usdz_url": "https://assets.meshy.ai/0630d47c-84b8-4d37-bc02-69e45d9272c1/tasks/018c425b-b2c6-727e-d333-3c1887i9h791/output/processed.usdz?Expires=...",
    "processed_armature_fbx_url": "https://assets.meshy.ai/0630d47c-84b8-4d37-bc02-69e45d9272c1/tasks/018c425b-b2c6-727e-d333-3c1887i9h791/output/processed_armature.fbx?Expires=...",
    "processed_animation_fps_fbx_url": "https://assets.meshy.ai/0630d47c-84b8-4d37-bc02-69e45d9272c1/tasks/018c425b-b2c6-727e-d333-3c1887i9h791/output/processed_60fps.fbx?Expires=..."
  },
  "preceding_tasks": 0
}

DELETE/openapi/v1/animations/:id

애니메이션 작업 삭제

이 엔드포인트는 애니메이션 작업과 관련된 모든 모델 및 데이터를 영구적으로 삭제합니다. 이 작업은 되돌릴 수 없습니다.

경로 매개변수

  • Name
    id
    Type
    path
    Description

    삭제할 애니메이션 작업의 ID입니다.

작업 상태

아직 PENDING 상태인 작업은 삭제되며, 생성 시 소모된 크레딧은 환불됩니다.

이미 IN_PROGRESS 상태인 작업은 삭제할 수 없습니다. 요청은 409 Conflict로 거부되며 작업은 계속 실행됩니다. 워커가 이미 시작한 작업에 대한 크레딧은 환불되지 않으므로, 실행 도중 삭제하면 크레딧과 결과물을 모두 잃게 됩니다. 작업이 SUCCEEDED, FAILED 또는 CANCELED 상태에 도달할 때까지 기다린 후 삭제하세요.

최종 상태(SUCCEEDED, FAILED 또는 CANCELED)인 작업은 환불 없이 삭제됩니다.

반환값

성공 시 200 OK를 반환하며, 작업이 IN_PROGRESS 상태인 경우 409 Conflict를 반환합니다.

Request

DELETE
/openapi/v1/animations/018b314a-a1b5-716d-c222-2f1776f7f579
curl --request DELETE \
  --url https://api.meshy.ai/openapi/v1/animations/018b314a-a1b5-716d-c222-2f1776f7f579 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Response

// 200 OK on success, with an empty body.
//
// 409 Conflict when the task is IN_PROGRESS — the task is left running:
{
  "message": "Task is IN_PROGRESS and cannot be deleted. Credits for a task the worker has already started are not refundable; wait for it to reach SUCCEEDED, FAILED or CANCELED, then delete it."
}

GET/openapi/v1/animations

애니메이션 작업 목록 조회

호출자의 애니메이션 작업 목록을 최신순으로 페이지네이션하여 반환합니다. page_num과 page_size를 통한 표준 페이지네이션을 지원합니다.

API를 통해 생성된 작업은 API를 통해서만 관리되며, 웹 앱의 My Assets에는 표시되지 않습니다. 더 이상 ID를 가지고 있지 않은 작업을 찾으려면 이 엔드포인트를 사용하세요.

Request

GET
/openapi/v1/animations
curl "https://api.meshy.ai/openapi/v1/animations?page_num=1&page_size=20" \
-H "Authorization: Bearer ${YOUR_API_KEY}"

GET/openapi/v1/animations/:id/stream

애니메이션 작업 스트리밍

이 엔드포인트는 Server-Sent Events(SSE)를 사용하여 애니메이션 작업의 실시간 업데이트를 스트리밍합니다.

매개변수

  • Name
    id
    Type
    path
    Description

    스트리밍할 애니메이션 작업의 고유 식별자입니다.

반환값

애니메이션 작업 객체의 스트림을 Server-Sent Events 형태로 반환합니다.

PENDING 또는 IN_PROGRESS 상태의 작업의 경우, 응답 스트림에는 필요한 progress 및 status 필드만 포함됩니다.

Request

GET
/openapi/v1/animations/018c425b-b2c6-727e-d333-3c1887i9h791/stream
curl -N https://api.meshy.ai/openapi/v1/animations/018c425b-b2c6-727e-d333-3c1887i9h791/stream 
-H "Authorization: Bearer ${YOUR_API_KEY}"

Response Stream

// Error event example
event: error
data: {
  "status_code": 404,
  "message": "Task not found"
}

// Message event examples illustrate task progress.
// For PENDING or IN_PROGRESS tasks, the response stream will not include all fields.
event: message
data: {
  "id": "018c425b-b2c6-727e-d333-3c1887i9h791",
  "progress": 0,
  "status": "PENDING"
}

event: message
data: {
  "id": "018c425b-b2c6-727e-d333-3c1887i9h791",
  "progress": 50,
  "status": "IN_PROGRESS"
}

event: message
data: { // Example of a SUCCEEDED task stream item, mirroring The Animation Task Object structure
  "id": "018c425b-b2c6-727e-d333-3c1887i9h791",
  "type": "animate",
  "status": "SUCCEEDED",
  "created_at": 1747032440896,
  "progress": 100,
  "started_at": 1747032441210,
  "finished_at": 1747032457530,
  "expires_at": 1747291657530,
  "task_error": {

    "message": ""

  },

  "consumed_credits": 3,
  "result": {
    "animation_glb_url": "https://assets.meshy.ai/.../Animation_Reaping_Swing_withSkin.glb?...",
    "animation_fbx_url": "https://assets.meshy.ai/.../Animation_Reaping_Swing_withSkin.fbx?...",
    "processed_usdz_url": "https://assets.meshy.ai/.../processed.usdz?...",
    "processed_armature_fbx_url": "https://assets.meshy.ai/.../processed_armature.fbx?...",
    "processed_animation_fps_fbx_url": "https://assets.meshy.ai/.../processed_60fps.fbx?..."
  },
  "preceding_tasks": 0
}

The Animation Task Object

Animation Task 객체는 리깅된 캐릭터에 애니메이션을 적용하는 작업 단위를 나타냅니다.

속성

  • Name
    id
    Type
    string
    Description

    작업의 고유 식별자입니다.

  • Name
    type
    Type
    string
    Description

    Animation 작업의 유형입니다. 값은 animate입니다.

  • Name
    status
    Type
    string
    Description

    작업의 상태입니다. 가능한 값: PENDING, IN_PROGRESS, SUCCEEDED, FAILED, CANCELED.

  • Name
    progress
    Type
    integer
    Description

    작업의 progress입니다 (0-100).

  • Name
    created_at
    Type
    timestamp
    Description

    작업이 생성된 타임스탬프(1970년 1월 1일 이후 경과한 밀리초)입니다.

  • Name
    started_at
    Type
    timestamp
    Description

    작업이 처리를 시작한 타임스탬프(1970년 1월 1일 이후 경과한 밀리초)입니다. 시작되지 않은 경우 0입니다.

  • Name
    finished_at
    Type
    timestamp
    Description

    작업이 완료된 타임스탬프(1970년 1월 1일 이후 경과한 밀리초)입니다. 완료되지 않은 경우 0입니다.

  • Name
    expires_at
    Type
    timestamp
    Description

    작업 결과 에셋이 만료되는 타임스탬프(1970년 1월 1일 이후 경과한 밀리초)입니다.

  • Name
    task_error
    Type
    object
    Description

    실패한 작업에 대한 오류 상세 정보입니다. 전체 task_error 객체 참조는 오류를 참고하세요.

  • Name
    consumed_credits
    Type
    integer
    Description

    이 작업으로 소비된 크레딧 수입니다. 작업 상태가 PENDING, IN_PROGRESS, 또는 SUCCEEDED일 때 존재합니다. FAILED 작업의 경우 0을 반환합니다 (실패 시 크레딧은 환불됩니다).

  • Name
    result
    Type
    object
    Description

    작업이 SUCCEEDED인 경우 출력 애니메이션 URL을 포함합니다.

    • Name
      animation_glb_url
      Type
      string
      Description
      GLB 형식의 애니메이션에 대한 다운로드 가능한 URL입니다. action_ids로 생성된 작업의 경우, 이 단일 파일에는 요청된 각 액션이 별도의 클립으로 포함됩니다.
    • Name
      animation_fbx_url
      Type
      string
      Description
      FBX 형식의 애니메이션에 대한 다운로드 가능한 URL입니다. action_ids로 생성된 작업의 경우, 이 단일 파일에는 요청된 각 액션이 별도의 클립으로 포함됩니다.
    • Name
      processed_usdz_url
      Type
      string
      Description
      USDZ 형식으로 처리된 애니메이션에 대한 다운로드 가능한 URL입니다.
    • Name
      processed_armature_fbx_url
      Type
      string
      Description
      FBX 형식으로 처리된 아마추어에 대한 다운로드 가능한 URL입니다.
    • Name
      processed_animation_fps_fbx_url
      Type
      string
      Description
      FPS가 변경된 FBX 형식의 애니메이션에 대한 다운로드 가능한 URL입니다 (예: change_fps 작업이 사용된 경우).
  • Name
    preceding_tasks
    Type
    integer
    Description

    대기열에서 앞서 있는 작업의 수입니다. 상태가 PENDING일 때만 의미가 있습니다.

Example Animation Task Object

{
  "id": "018c425b-b2c6-727e-d333-3c1887i9h791",
  "type": "animate",
  "status": "SUCCEEDED",
  "created_at": 1747032440896,
  "progress": 100,
  "started_at": 1747032441210,
  "finished_at": 1747032457530,
  "expires_at": 1747291657530,
  "task_error": {

    "message": ""

  },

  "consumed_credits": 3,
  "result": {
    "animation_glb_url": "https://assets.meshy.ai/.../Animation_Reaping_Swing_withSkin.glb?...",
    "animation_fbx_url": "https://assets.meshy.ai/.../Animation_Reaping_Swing_withSkin.fbx?...",
    "processed_usdz_url": "https://assets.meshy.ai/.../processed.usdz?...",
    "processed_armature_fbx_url": "https://assets.meshy.ai/.../processed_armature.fbx?...",
    "processed_animation_fps_fbx_url": "https://assets.meshy.ai/.../processed_60fps.fbx?..."
  },
  "preceding_tasks": 0
}

GET/openapi/v1/animations/library

애니메이션 목록 조회

라이브러리에 있는 모든 애니메이션을 action_id 순으로 정렬하여 반환합니다. 응답은 페이지 단위가 아닌 전체 목록이므로, 한 번의 호출로 액션 선택기를 채우기에 충분합니다. 필터는 결과를 좁혀주며, 모두 생략하면 전체를 가져옵니다.

각 액션의 애니메이션 미리보기와 함께 동일한 카탈로그를 직접 눈으로 살펴보려면 애니메이션 라이브러리 참조를 확인하세요.

이 엔드포인트는 무료이며, 크레딧을 소비하지 않습니다.

매개변수

  • Name
    search
    Type
    string
    Description

    name 또는 key에 대한 대소문자를 구분하지 않는 부분 문자열 일치입니다. 문자 그대로 일치하므로 %와 _는 와일드카드가 아닌 일반 문자로 취급됩니다.

  • Name
    category
    Type
    string
    Description

    category와 정확히 일치합니다.

    사용 가능한 값:

    • WalkAndRun
    • BodyMovements
    • DailyActions
    • Fighting
    • Dancing
  • Name
    sub_category
    Type
    string
    Description

    sub_category와 정확히 일치합니다. 단독으로 사용할 수 있습니다 — 하위 카테고리 이름은 카테고리 간에 고유하지 않으므로(Transitioning은 Fighting과 DailyActions 양쪽에 모두 존재합니다), category 없이 사용하면 이 필터는 해당 하위 카테고리가 나타나는 모든 곳에서 일치합니다.

  • Name
    action_ids
    Type
    string
    Description

    반환할 action_id 값의 쉼표로 구분된 목록으로, 둘러보는 대신 특정 id를 확인할 때 사용합니다. 최대 200개의 id를 받을 수 있습니다. 어떤 애니메이션도 가지고 있지 않은 id는 응답에서 단순히 제외되므로, 저장해 둔 id가 여전히 유효한지 확인하는 용도로도 사용할 수 있습니다.

필터 조합하기

필터는 함께 적용됩니다 — 각 필터는 결과를 더 좁혀나가므로, 애니메이션은 모든 조건을 만족할 때만 반환됩니다. 단일 필터 내에서는 여러 값 중 하나라도 일치하면 됩니다: search는 name 또는 key와 일치하고, action_ids는 목록에 있는 id 중 하나와 일치합니다.

즉, 겹치는 부분이 없는 조합은 오류가 아니라 빈 배열을 반환합니다. 액션 92는 "Double Combo Attack"이며, Fighting 애니메이션입니다:

  • ?action_ids=92&category=Fighting은 액션 92를 반환합니다.
  • ?action_ids=92&category=Dancing은 []를 반환합니다 — Dancing 애니메이션이 아니기 때문입니다.
  • ?action_ids=92&search=walk는 []를 반환합니다 — 이름이 walk와 일치하지 않기 때문입니다.

카테고리와 상관없이 특정 애니메이션을 가져오려면 action_ids만 단독으로 전달하세요.

반환값

애니메이션 객체 목록을 반환합니다.

Request

GET
/openapi/v1/animations/library
curl "https://api.meshy.ai/openapi/v1/animations/library?category=Fighting" \
-H "Authorization: Bearer ${YOUR_API_KEY}"

Response

[
  {
    "action_id": 4,
    "name": "Attack",
    "key": "Attack",
    "category": "Fighting",
    "sub_category": "AttackingwithWeapon",
    "preview_url": "https://cdn.meshy.ai/webapp-assets/feature-demo/animation/preview/biped/Attack.gif"
  },
  {
    "action_id": 92,
    "name": "Double Combo Attack",
    "key": "Double_Combo_Attack",
    "category": "Fighting",
    "sub_category": "AttackingwithWeapon",
    "preview_url": "https://cdn.meshy.ai/webapp-assets/feature-demo/animation/preview/biped/Double_Combo_Attack.gif"
  }
]

Animation 객체

  • Name
    action_id
    Type
    integer
    Description

    애니메이션 작업을 생성할 때 action_id로 전달할 값입니다. 고유하고 안정적이지만 연속적이지는 않습니다 — 폐기된 애니메이션은 번호 체계에 공백을 남기므로, 특정 범위의 id가 모두 유효하다고 가정해서는 안 됩니다.

  • Name
    name
    Type
    string
    Description

    표시용으로 사용되는 사람이 읽을 수 있는 레이블입니다. 고유하지 않습니다: 일부 애니메이션은 다른 변형과 이름을 공유하므로, 식별자로는 action_id 또는 key를 사용하세요.

  • Name
    key
    Type
    string
    Description

    애니메이션에 대한 고유하고 안정적인 슬러그입니다. 자체 저장소의 키로 사용할 숫자가 아닌 식별자가 필요할 때 사용하세요.

  • Name
    category
    Type
    string
    Description

    최상위 그룹으로, 예를 들면 Fighting입니다.

  • Name
    sub_category
    Type
    string
    Description

    카테고리 내의 그룹으로, 예를 들면 AttackingwithWeapon입니다.

  • Name
    preview_url
    Type
    string
    Description

    해당 동작을 미리 보여주는 애니메이션 GIF의 URL로, 자체 선택 UI에서 바로 렌더링하기에 적합합니다.

Example Animation Object

{
  "action_id": 92,
  "name": "Double Combo Attack",
  "key": "Double_Combo_Attack",
  "category": "Fighting",
  "sub_category": "AttackingwithWeapon",
  "preview_url": "https://cdn.meshy.ai/webapp-assets/feature-demo/animation/preview/biped/Double_Combo_Attack.gif"
}