Creative Lab — Fidget Pixel API

將一張來源照片分兩個階段轉換為可多色 3D 列印的像素藝術指尖玩具板:**prototype(原型)**階段會將你的照片像素化為像素藝術圖像,接著 **build(建構)**階段會將該圖像取樣到 16×16 或 32×32 的網格上,並將每個像素轉化為一個可互鎖的方形或六邊形零件,最終以單一 3MF 檔案交付,其中的物件帶有各自的顏色資訊,以便多料絲 slicer 能為每個零件列印出正確的顏色。這兩個階段透過 input_task_id 關聯。

  • POST /openapi/creative-lab/fidget-pixel/v1/prototype
  • POST /openapi/creative-lab/fidget-pixel/v1/build

POST/openapi/creative-lab/fidget-pixel/v1/prototype

建立一個 Fidget Pixel 原型任務

根據來源照片產生一張像素藝術圖像。回傳的任務 ID 就是你在呼叫建構 endpoint 時作為 input_task_id 傳入的值。如果結果不是你想要的,可以再次呼叫該 endpoint 產生另一次結果——每次呼叫都會單獨計費。回應結構請參考 Fidget Pixel Prototype 任務物件

參數

  • Name
    image_url
    Type
    string
    必選
    Description

    供 Meshy 像素化處理的來源照片。目前我們支援 .jpg.jpeg.png.webp 格式。

    格式是透過解碼圖像資料來偵測的,而非根據 URL 的副檔名——即使 URL 沒有副檔名,或者會發生重新導向,只要解碼後的位元組符合支援的格式即可正常使用。系統會自動跟隨 HTTP 重新導向。

    提供圖像有兩種方式:

    • 可公開存取的 URL:一個可以從公共網際網路存取到的 URL。
    • Data URI:圖像的 base64 編碼 data URI。data URI 範例:data:image/jpeg;base64,<your base64-encoded image data>
  • Name
    type
    Type
    string
    必選
    Description

    照片展示的內容。此參數決定像素化風格,因此請謹慎選擇——兩種取值會產生明顯不同的效果。可選值:

    • person — 主體是人物(肖像或全身)。產生主體的 Q 版風格像素精靈。
    • other — 其他任何內容:寵物、物品、吉祥物、標誌、風景。產生主體的拼豆藝術風格像素圖示。
  • Name
    name
    Type
    string
    Description

    用於展示目的的可選任務名稱。最多 100 個字元。

回傳值

回應的 result 屬性包含新建立的 fidget pixel 原型任務的任務 id。輪詢 取得任務 endpoint,或訂閱 stream,直到任務狀態變為 SUCCEEDED,然後將該 ID 作為 input_task_id 傳遞給 建構 endpoint

失敗模式

  • Name
    400 - Bad Request
    Description

    請求內容不可接受。常見原因:

    • 缺少參數image_urltype 均為必填項目。
    • type 無效type 必須為 personother
    • 圖像格式無效:提供的 image_url 不是受支援的格式(.jpg.jpeg.png.webp)。
    • 圖像尺寸超出範圍:圖像過小、超出最大檔案大小限制,或超出最大像素數限制。
    • URL 無法存取:無法下載 image_url(404 或 timeout)。
    • Data URI 無效:base64 字串格式錯誤。
    • 內容被標記:輸入圖像被 NSFW moderation 標記。
  • Name
    401 - Unauthorized
    Description

    身分驗證失敗。請檢查你的 API key。

  • Name
    402 - Payment Required
    Description

    credits 不足以執行此任務,或該 API key 屬於免費方案帳戶。

  • Name
    403 - Forbidden
    Description

    輸入圖像被智慧財產權 moderation 標記(Content flagged for intellectual property violation)。僅啟用了智慧財產權過濾功能的企業版帳戶會被阻擋;不會產生任何費用。

  • Name
    429 - Too Many Requests
    Description

    你已超出速率限制。

  • Name
    500 - Internal Server Error
    Description

    智慧財產權檢查本身未能完成(Unable to perform intellectual property check, please try again)。啟用了智慧財產權過濾功能的企業版帳戶在此項檢查失敗時會採取保守策略(fail closed);不會產生任何費用——請重試該請求。

Request

POST
/openapi/creative-lab/fidget-pixel/v1/prototype
# Stage 1: pixelize the source photo
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype \
  -X POST \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
    "image_url": "<your publicly accessible image url or base64-encoded data URI>",
    "type": "person"
  }'

Response

{
  "result": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7"
}

POST/openapi/creative-lab/fidget-pixel/v1/build

建立 Fidget Pixel 建構任務

根據一個已成功的原型任務生成可 3D 列印的零件。建構過程會將原型的像素畫圖像取樣到所請求的網格上,將其量化為最多 color_count 種顏色,並為每個網格單元生成一個互鎖零件。最終產物是一個單獨的 3MF 檔案,其中每個零件都是一個帶有其顏色標籤的獨立物件,可直接用於多耗材 slicer。回應結構請參見 Fidget Pixel 建構任務物件

參數

  • Name
    input_task_id
    Type
    string
    必選
    Description

    透過同一個 OpenAPI endpoint 建立的原型任務的任務 ID。該原型必須由同一個 Meshy 帳戶建立,且必須已達到 SUCCEEDED 狀態。

    透過 webapp 建立的原型任務不被接受——建構 endpoint 僅接受由 POST /openapi/creative-lab/fidget-pixel/v1/prototype 生成的原型任務,其他任何來源都會被拒絕並回傳 404

  • Name
    name
    Type
    string
    Description

    可選的任務名稱,用於顯示目的。最多 100 個字元。

options

可選的零件 geometry 設定。每個欄位都有預設值——僅需傳送你想覆寫的欄位。這些控制項與 Creative Lab webapp 中公開的控制項相同;插銷高度、頂蓋比例以及其他製造預設均由 shapepiece_size_mm 推導得出,不對外公開。

  • Name
    shape
    Type
    string
    預設值 square
    Description

    每個零件的外形輪廓。可用取值:

    • square(預設)—— 方形網格上的方形零件。
    • hex —— 六邊形網格上的六邊形零件。六邊形零件僅提供 68 毫米規格。
  • Name
    grid_size
    Type
    integer
    預設值 32
    Description

    棋盤每邊的零件數量。可用取值:163232 網格保留更多細節;16 網格意味著在相同主題下零件更少、更大。

  • Name
    piece_size_mm
    Type
    integer
    預設值 8
    Description

    每個零件的邊長,單位為毫米。可用取值:6810。該值與 grid_size 共同決定列印棋盤的大小——例如 32 × 8 毫米約為每邊 26 公分。shape: "hex" 不支援 10(大多數消費級 FDM 列印機上,傾斜的六邊形面會出現懸垂問題)。

  • Name
    color_count
    Type
    integer
    預設值 8
    Description

    圖像量化調色板中的最大顏色數量。範圍:[1, 8]。每種顏色在你的 slicer 中對應一種耗材。

  • Name
    piece_height_mm
    Type
    integer
    預設值 15
    Description

    每個零件的高度,單位為毫米。範圍:[10, 80]

output

可選的輸出格式選擇器。預設為 3mf,目前這是唯一支援的取值。

  • Name
    format
    Type
    string
    預設值 3mf
    Description

    建構回傳的產物。可用取值:

    • 3mf(預設)—— 在 model_urls.3mf 下回傳單一 model.3mf 檔案,每個零件對應一個物件,且每個物件都附帶了零件顏色。

回傳值

回應的 result 屬性包含新建立的 fidget pixel 建構任務的任務 id。輪詢 取得任務 endpoint 或訂閱 串流介面,直到任務達到 SUCCEEDED 狀態,然後從 model_urls.3mf 下載產物。

失敗模式

  • Name
    400 - Bad Request
    Description

    請求不可接受。常見原因:

    • 缺少參數input_task_id 為必填項。
    • 無效的 UUIDinput_task_id 不是有效的 UUID。
    • 父任務未成功:所引用的原型任務尚未達到 SUCCEEDED 狀態。
    • 無候選結果:原型任務已成功,但未生成任何像素畫圖像;請建立一個新的原型。
    • 選項超出範圍options 中的某個欄位超出了其允許的取值集合或範圍——例如 options.grid_size must be 16 or 32,或 options.piece_size_mm=10 is not supported for shape=hex; hex pieces are available in 6 and 8 mm
    • 不支援的格式output.format 必須為 3mf
  • Name
    401 - Unauthorized
    Description

    身份驗證失敗。請檢查你的 API key。

  • Name
    402 - Payment Required
    Description

    執行此任務的 credits 不足,或該 API key 屬於免費方案帳戶。

  • Name
    403 - Forbidden
    Description

    所引用原型的圖像被智慧財產權 moderation 標記。僅啟用了智慧財產權過濾功能的 Enterprise 帳戶會被阻止;不會產生任何扣費。

  • Name
    404 - Not Found
    Description

    所引用的原型任務不存在、屬於其他使用者,或是透過 webapp 建立的(只有 API 模式下建立的原型任務才能串接到建構流程)。

  • Name
    429 - Too Many Requests
    Description

    你已超出速率限制。

  • Name
    500 - Internal Server Error
    Description

    無法確定所引用原型的智慧財產權判定結果(Unable to perform intellectual property check, please try again)。啟用了智慧財產權過濾功能的 Enterprise 帳戶在此項檢查失敗時會採取拒絕策略;不會產生任何扣費——請重試該請求。

Request

POST
/openapi/creative-lab/fidget-pixel/v1/build
# Stage 2: chain build off a succeeded prototype task
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build \
  -X POST \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
    "input_task_id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
    "options": {
      "shape": "square",
      "grid_size": 32,
      "piece_size_mm": 8,
      "color_count": 8,
      "piece_height_mm": 15
    },
    "output": {
      "format": "3mf"
    }
  }'

Response

{
  "result": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98"
}

GET/openapi/creative-lab/fidget-pixel/v1/(prototype|build)/:id

檢索 Fidget Pixel 任務

根據有效的任務 id 檢索原型(prototype)或構建(build)任務。URL 路徑 必須與任務所處的階段相符——透過 /prototype/:id 取得構建任務 會回傳 404,反之亦然。

回應格式請參閱 Fidget Pixel 原型任務物件Fidget Pixel 構建任務物件

參數

  • Name
    id
    Type
    path
    Description

    要檢索的 fidget pixel 任務的唯一識別碼。

回傳值

回應包含 fidget pixel 任務物件。其結構取決於 所請求的階段。

失敗模式

  • Name
    400 - Bad Request
    Description

    id 不是有效的 UUID(Invalid ID)。

  • Name
    403 - Forbidden
    Description

    該任務的圖片被智慧財產權審核(moderation)標記。僅啟用了智慧財產權過濾功能的企業帳號會被阻擋。

  • Name
    404 - Not Found
    Description

    該任務不存在、屬於其他使用者,或其所處階段與 URL 路徑不符。

  • Name
    500 - Internal Server Error
    Description

    無法完成智慧財產權檢查(Unable to perform intellectual property check, please try again);啟用了智慧財產權過濾功能的企業帳號在此情況下會按失敗關閉(fail closed)處理。請重試該請求。

Request

GET
/openapi/creative-lab/fidget-pixel/v1/prototype/019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7
# Prototype
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype/019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

# Build
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Prototype Response

{
  "id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
  "type": "creative-lab-fidget-pixel-prototype",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1757001000000,
  "started_at": 1757001005000,
  "finished_at": 1757001178000,
  "expires_at": 1757260378000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 6,
  "image_urls": [
    "https://assets.meshy.ai/***/pixel-art.jpg?Expires=***"
  ]
}

Build Response

{
  "id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
  "type": "creative-lab-fidget-pixel-build",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1757001300000,
  "started_at": 1757001304000,
  "finished_at": 1757001309000,
  "expires_at": 1757260509000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 30,
  "model_urls": {
    "3mf": "https://assets.meshy.ai/***/tasks/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/output/model.3mf?Expires=***"
  }
}

DELETE/openapi/creative-lab/fidget-pixel/v1/(prototype|build)/:id

刪除 Fidget Pixel 任務

取消一個 fidget pixel 任務。如果任務仍處於 PENDING 狀態,建立時消耗的 積分將會被退還。已經處於 IN_PROGRESS 狀態的任務會被取消但不會退款 (工作程序可能已經在消耗資源)。已經達到終止狀態 (SUCCEEDEDFAILEDCANCELED)的任務無法被取消。

URL 路徑必須與任務所處的階段相符 —— 對 /prototype/:buildId 執行 DELETE 將回傳 404

路徑參數

  • Name
    id
    Type
    path
    Description

    要取消的 fidget pixel 任務的唯一識別碼。

回傳值

成功時回傳 204 No Content,回應內容為空。

失敗模式

  • Name
    400 - Bad Request
    Description

    請求無法被接受。常見原因:

    • 無效的 IDid 不是一個有效的 UUID。
    • 終止狀態:任務已經處於 SUCCEEDEDFAILEDCANCELED 狀態,無法被取消。
  • Name
    404 - Not Found
    Description

    該任務不存在、屬於其他使用者,或其所處階段與 URL 路徑不符。

Request

DELETE
/openapi/creative-lab/fidget-pixel/v1/prototype/019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7
curl --request DELETE \
  --url https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype/019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Response

// Returns 204 No Content on success (empty body).

GET/openapi/creative-lab/fidget-pixel/v1/(prototype|build)/:id/stream

流式取得 Fidget Pixel 任務

透過 Server-Sent Events(SSE)流式取得 fidget pixel 任務的即時更新。 URL 路徑必須與任務所處的階段相符 —— 在 /prototype/:buildId/stream 開啟串流會發出一個 event: error 的 payload,其 status_code: 404,隨後關閉該串流;格式錯誤的 id 也會發生同樣的情況, 但 status_code: 400Invalid ID)。

參數

  • Name
    id
    Type
    path
    Description

    要進行流式取得的 fidget pixel 任務的唯一識別碼。

回傳值

以 Server-Sent Events 的形式回傳一系列 Fidget Pixel PrototypeFidget Pixel Build 任務物件。 每一幀都攜帶該階段的完整任務物件 —— 與 Get 端點回傳的結構相同 —— 因此當任務處於 PENDINGIN_PROGRESS 狀態時,輸出欄位只是尚未被填入(為 null[]{}),且 finished_atnull

Request

GET
/openapi/creative-lab/fidget-pixel/v1/build/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/stream
curl -N https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/stream \
-H "Authorization: Bearer ${YOUR_API_KEY}"

Response Stream

// Error event example (wrong stage or task not found)
event: error
data: {
  "status_code": 404,
  "message": "Task not found"
}

// Message event examples illustrate task progress.
// Every frame is the full task object for the stage; fields not yet populated are null / empty.
event: message
data: {
  "id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
  "type": "creative-lab-fidget-pixel-build",
  "name": "",
  "status": "PENDING",
  "progress": 0,
  "created_at": 1757001300000,
  "started_at": null,
  "finished_at": null,
  "expires_at": 1757260500000,
  "preceding_tasks": 2,
  "task_error": null,
  "consumed_credits": 30,
  "model_urls": {}
}

event: message
data: {
  "id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
  "type": "creative-lab-fidget-pixel-build",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1757001300000,
  "started_at": 1757001304000,
  "finished_at": 1757001309000,
  "expires_at": 1757260509000,
  "task_error": null,
  "consumed_credits": 30,
  "model_urls": {
    "3mf": "https://assets.meshy.ai/***/tasks/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/output/model.3mf?Expires=***"
  }
}

GET/openapi/creative-lab/fidget-pixel/v1/(prototype|build)

取得 Fidget Pixel 任務清單

取得你在單一階段的 fidget pixel 任務的分頁清單。 URL 路徑用於選擇階段——/prototype 回傳 prototype 任務; /build 回傳 build 任務。另一個階段的任務不會包含在 任一回應中。

路徑參數

  • Name
    stage
    Type
    path
    必選
    Description

    prototypebuild 二者之一。此集合僅回傳 階段與 URL 相符的任務——請求 /prototype 永遠不會回傳 build 任務,反之亦然。

查詢參數

  • Name
    page_num
    Type
    integer
    預設值 1
    Description

    用於分頁的頁碼。

  • Name
    page_size
    Type
    integer
    預設值 10
    Description

    每頁大小限制。允許的最大值為 100 項。

  • Name
    sort_by
    Type
    string
    預設值 -created_at
    Description

    排序所依據的欄位。可用值:

    • +created_at:依建立時間升冪排序。
    • -created_at:依建立時間降冪排序。

回傳值

回傳該階段任務物件的分頁清單——列出 /prototype 時為 the fidget pixel prototype task object, 列出 /build 時為 the fidget pixel build task object

Request

GET
/openapi/creative-lab/fidget-pixel/v1/prototype
# List prototype tasks
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/prototype?page_size=10 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

# List build tasks
curl https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1/build?page_size=10 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Response (List Prototype Tasks)

[
  {
    "id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
    "type": "creative-lab-fidget-pixel-prototype",
    "name": "",
    "status": "SUCCEEDED",
    "progress": 100,
    "created_at": 1757001000000,
    "started_at": 1757001005000,
    "finished_at": 1757001178000,
    "expires_at": 1757260378000,
    "preceding_tasks": 0,
    "task_error": null,
    "consumed_credits": 6,
    "image_urls": [
      "https://assets.meshy.ai/***/pixel-art.jpg?Expires=***"
    ]
  }
]

Fidget Pixel 原型任務物件

Fidget Pixel 原型任務物件是 Meshy 用來追蹤將來源照片像素化為像素藝術圖像的工作單元。此階段的輸出會透過 input_task_id 連結到建構階段

屬性

  • Name
    id
    Type
    string
    Description

    任務的唯一識別碼。雖然我們在實作細節上使用 k-可排序的 UUID 作為任務 id,但你不應對 id 的格式做任何假設。

  • Name
    type
    Type
    string
    Description

    任務的類型。該值為 creative-lab-fidget-pixel-prototype

  • Name
    name
    Type
    string
    Description

    建立任務時提供的任務名稱。如果沒有提供名稱,則為空字串。

  • Name
    status
    Type
    string
    Description

    任務的狀態。可能的值為 PENDINGIN_PROGRESSSUCCEEDEDFAILEDCANCELED 之一。

  • Name
    progress
    Type
    integer
    Description

    任務的 progress。如果任務尚未開始,此屬性將為 0。任務成功後,此值將變為 100

  • Name
    created_at
    Type
    timestamp
    Description

    任務建立時的時間戳,以毫秒為單位。

  • Name
    started_at
    Type
    timestamp
    Description

    任務開始時的時間戳,以毫秒為單位。如果任務尚未開始,此屬性將為 null

  • Name
    finished_at
    Type
    timestamp
    Description

    任務完成時的時間戳,以毫秒為單位。如果任務尚未完成,此屬性將為 null

  • Name
    expires_at
    Type
    timestamp
    Description

    任務結果過期時的時間戳,以毫秒為單位——即任務完成後 3 天。企業帳戶會無限期保留 API 結果(參見資產保留期);對於這類帳戶,此時間戳會被設定為大約 100 年之後。

  • Name
    preceding_tasks
    Type
    integer
    Description

    前置任務的數量。

  • Name
    task_error
    Type
    object
    Description

    失敗任務的錯誤詳情。完整的 task_error 物件參考請參見錯誤

  • Name
    consumed_credits
    Type
    integer
    Description

    該任務消耗的 credits 數量。達到 SUCCEEDED 狀態的任務會按其所屬階段全額扣費。從未被建立的任務(請求時回傳 4xx,包括被 moderation 拒絕的情況)完全不會扣費。達到 FAILED 狀態的任務回傳 0——扣費會被退還。透過 DELETE 取消任務只有在任務仍處於 PENDING 狀態時才會退款;已處於 IN_PROGRESS 狀態的任務仍會被扣費,因為相關工作已經產生。

  • Name
    image_urls
    Type
    array of strings
    Description

    此原型任務生成的像素藝術圖像的可下載 URL。目前 API 始終恰好回傳一張圖像;該欄位之所以設計為陣列,是為了讓未來的版本能夠在不引入破壞性變更的情況下呈現多個候選結果。在任務達到 SUCCEEDED 之前該欄位為空。

    這些是簽名 URL:取得時無需攜帶 Authorization 請求標頭。它們在 expires_at(即 finished_at 之後 3 天)之前始終有效,在此期間重新讀取任務會回傳相同的 URL,而不是重新簽名的新 URL。請在此之前自行下載並儲存檔案——過期的連結無法刷新。

Example Fidget Pixel Prototype Task Object

{
  "id": "019c4a1e-2b7d-7d03-8f6a-5c2e91f0a1b7",
  "type": "creative-lab-fidget-pixel-prototype",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1757001000000,
  "started_at": 1757001005000,
  "finished_at": 1757001178000,
  "expires_at": 1757260378000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 6,
  "image_urls": [
    "https://assets.meshy.ai/***/pixel-art.jpg?Expires=***"
  ]
}

Fidget Pixel 建構任務物件

Fidget Pixel 建構任務物件是 Meshy 用來追蹤的一個工作單元,用於從已成功完成的原型任務生成可列印的部件。建構過程會將原型的像素藝術圖像取樣到所請求的網格上,並發布一個帶顏色標籤的 3MF 檔案。

屬性

  • Name
    id
    Type
    string
    Description

    任務的唯一識別碼。

  • Name
    type
    Type
    string
    Description

    任務的類型。該值為 creative-lab-fidget-pixel-build

  • Name
    name
    Type
    string
    Description

    建立任務時提供的任務名稱。如果未提供名稱,則為空字串。

  • Name
    status
    Type
    string
    Description

    任務的狀態。可能的值為 PENDINGIN_PROGRESSSUCCEEDEDFAILEDCANCELED 之一。

  • Name
    progress
    Type
    integer
    Description

    任務的 progress。如果任務尚未開始,此屬性為 0。一旦任務成功完成,該值將變為 100

  • Name
    created_at
    Type
    timestamp
    Description

    任務建立時的時間戳,單位為毫秒。

  • Name
    started_at
    Type
    timestamp
    Description

    任務開始時的時間戳,單位為毫秒。在任務開始之前為 null

  • Name
    finished_at
    Type
    timestamp
    Description

    任務完成時的時間戳,單位為毫秒。在任務完成之前為 null

  • Name
    expires_at
    Type
    timestamp
    Description

    任務結果過期時的時間戳,單位為毫秒——即任務完成後的 3 天。企業帳戶會無限期保留 API 結果(參見資產保留期);對於企業帳戶,此時間戳會被設定為約 100 年之後。

  • Name
    preceding_tasks
    Type
    integer
    Description

    排在前面的任務數量。僅當狀態為 PENDING 時才有意義。

  • Name
    task_error
    Type
    object
    Description

    失敗任務的錯誤詳情。完整的 task_error 物件參考請參見 Errors

  • Name
    consumed_credits
    Type
    integer
    Description

    此任務消耗的積分數量。達到 SUCCEEDED 狀態的任務將被收取其階段的全部費用。從未成功建立的任務(請求時回傳 4xx,包括 moderation 拒絕的情況)不會產生任何費用。達到 FAILED 狀態的任務回傳 0——費用會被退還。透過 DELETE 取消任務只有在任務仍處於 PENDING 狀態時才會退款;已經處於 IN_PROGRESS 狀態的任務仍會被收費,因為相應的工作已經產生。

  • Name
    model_urls
    Type
    object
    Description

    按格式索引的、可下載生成產物的 URL。僅包含一個項目——即透過建構請求中的 output.format 所請求的格式。在任務達到 SUCCEEDED 狀態之前為空。

    這些是簽名 URL:擷取時不要攜帶 Authorization 標頭。它們在 expires_at(即 finished_at 之後 3 天)之前一直有效,在此期間內重新讀取任務會回傳相同的 URL,而不是重新簽名的新 URL。請在此之前自行下載並儲存檔案——過期的連結無法刷新。

    • Name
      3mf
      Type
      string
      Description

      3MF 檔案的可下載 URL。每個部件對應一個物件,並以其調色板顏色進行標記,因此支援多耗材的切片軟體可以按顏色分配耗材。當 output.format3mf(預設值)時會出現此欄位。

Example Fidget Pixel Build Task Object

{
  "id": "019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98",
  "type": "creative-lab-fidget-pixel-build",
  "name": "",
  "status": "SUCCEEDED",
  "progress": 100,
  "created_at": 1757001300000,
  "started_at": 1757001304000,
  "finished_at": 1757001309000,
  "expires_at": 1757260509000,
  "preceding_tasks": 0,
  "task_error": null,
  "consumed_credits": 30,
  "model_urls": {
    "3mf": "https://assets.meshy.ai/***/tasks/019c4a2f-6e81-7b44-9a1d-0d7f3c5e2b98/output/model.3mf?Expires=***"
  }
}

端到端示例

完整流程:從一張照片建立原型,輪詢直到狀態變為 SUCCEEDED,基於該原型建立構建任務,輪詢構建任務直到狀態變為 SUCCEEDED,然後從 model_urls 下載 3MF 檔案。

原型通常在幾分鐘內完成;構建任務通常在一分鐘以內即可完成。在實際整合中,你應該把原型的 image_urls 條目展示給最終使用者,讓他們確認(或重新執行原型)之後,再在構建任務上花費積分。

Complete flow

POST
/openapi/creative-lab/fidget-pixel/v1
#!/usr/bin/env bash
set -euo pipefail

# Requires curl and jq. Point IMAGE_PATH at a local photo, or IMAGE_URL at a public one:
#   export MESHY_API_KEY=msy_...
#   export IMAGE_PATH=./portrait.jpg          # or: export IMAGE_URL=https://...
#   export PIXEL_TYPE=person                  # or: other
: "${MESHY_API_KEY:?export MESHY_API_KEY first}"
if [[ -z "${IMAGE_PATH:-}" && -z "${IMAGE_URL:-}" ]]; then
  echo "export IMAGE_PATH (local file) or IMAGE_URL (public url) first" >&2
  exit 1
fi
PIXEL_TYPE=${PIXEL_TYPE:-person}

BASE="https://api.meshy.ai/openapi/creative-lab/fidget-pixel/v1"
AUTH="Authorization: Bearer $MESHY_API_KEY"

# api METHOD URL [curl args...] -> prints the response body, non-zero on failure.
# Note we do not use -f/--fail: it discards the body, and the body is the only
# place the reason appears.
api() {
  local method=$1 url=$2 out http_code body
  shift 2
  out=$(curl --silent --show-error --max-time 60 --write-out $'\n%{http_code}' \
    -X "$method" "$url" -H "$AUTH" "$@") || return 1
  http_code=${out##*$'\n'}
  body=${out%$'\n'*}
  if ((http_code >= 400)); then
    echo "HTTP $http_code for $url: $body" >&2
    return 1
  fi
  printf '%s' "$body"
}

# Each task gets its own 40-minute budget.
poll() {
  local kind=$1 id=$2 delay=5 task_status deadline
  deadline=$(($(date +%s) + 2400))
  while :; do
    if (($(date +%s) >= deadline)); then
      echo "gave up waiting for $kind $id" >&2
      return 1
    fi
    task_status=$(api GET "$BASE/$kind/$id" | jq -r '.status')
    echo "$kind: $task_status"
    case "$task_status" in
    SUCCEEDED) return 0 ;;
    FAILED | CANCELED) return 1 ;;
    esac
    sleep "$delay"
    delay=$((delay * 2 > 30 ? 30 : delay * 2))
  done
}

# Build the request body in a file. A base64 data URI must never go on the
# command line or into an exported variable - a photo of any real size will
# exceed the OS argument limit.
BODY=$(mktemp)
trap 'rm -f "$BODY"' EXIT
if [[ -n "${IMAGE_PATH:-}" ]]; then
  # Declare the real type: the API accepts JPEG, PNG and WebP.
  case "$(printf '%s' "${IMAGE_PATH##*.}" | tr 'A-Z' 'a-z')" in
    png) MIME=image/png ;;
    webp) MIME=image/webp ;;
    *) MIME=image/jpeg ;;
  esac
  {
    printf '{"type":"%s","image_url":"data:%s;base64,' "$PIXEL_TYPE" "$MIME"
    base64 <"$IMAGE_PATH" | tr -d '\n'
    printf '"}'
  } >"$BODY"
else
  jq -n --arg t "$PIXEL_TYPE" --arg u "$IMAGE_URL" \
    '{type: $t, image_url: $u}' >"$BODY"
fi

# 1. Create the prototype task
PROTO_ID=$(api POST "$BASE/prototype" \
  -H 'Content-Type: application/json' --data-binary @"$BODY" | jq -r '.result')

# 2. Wait for the pixel-art image (show image_urls[0] to a user in production)
poll prototype "$PROTO_ID"

# 3. Create the build task (defaults: square pieces, 32x32 grid, 8 mm, 8 colors, 15 mm tall)
jq -n --arg p "$PROTO_ID" \
  '{input_task_id: $p, options: {shape: "square", grid_size: 32, piece_size_mm: 8, color_count: 8, piece_height_mm: 15}, output: {format: "3mf"}}' >"$BODY"
BUILD_ID=$(api POST "$BASE/build" \
  -H 'Content-Type: application/json' --data-binary @"$BODY" | jq -r '.result')

# 4. Wait for the pieces
poll build "$BUILD_ID"

# 5. Download the 3MF. This is a signed URL: no Authorization header,
#    and it stays valid for 3 days after the task finishes.
TASK=$(api GET "$BASE/build/$BUILD_ID")
curl --silent --show-error --fail --max-time 900 \
  -o fidget-pixel.3mf "$(jq -r '.model_urls["3mf"]' <<<"$TASK")"
echo "Done: fidget-pixel.3mf"