lowpoly 將於 2026年10月30日 下線。 請在這些日期前切換模型,以免請求出錯。 查看所有棄用資訊

Creative Lab Fidget Pixel API

透過兩個階段將一張照片轉換為可 3D 列印的多彩像素藝術指尖玩具板。原型任務會將照片轉換為像素藝術圖像。構建任務會將該圖像轉換為相互咬合的零件,並整合到單一 3MF 檔案中,同時將原型任務的 ID 作為 input_task_id。

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

這兩個 POST endpoint 都需要付費方案。免費方案帳號發出的請求將回傳 402。


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

建立 Fidget Pixel 原型任務

從一張照片產生一張像素畫圖像。要建構部件,請將此任務的 ID 作為 input_task_id 傳給建構 endpoint。關於任務欄位的說明,請參閱 Fidget Pixel 原型任務物件。

如果你不喜歡產生的圖像,可以再建立一個原型任務。每個任務都會單獨計費。

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"
}

參數

  • Name
    image_url
    Type
    string
    必選
    Description

    要轉換成像素畫的照片,可以是公開可存取的 URL,或 data URI(data:image/jpeg;base64,<your base64-encoded image data>)。

    圖像必須是 JPG、JPEG、PNG 或 WebP 檔案,且大小不超過 20 MB。Meshy 會根據圖像資料來偵測格式,而不是依據 URL 中的副檔名。沒有副檔名的 URL 也能正常運作,而且 Meshy 會跟隨重新導向。

  • Name
    type
    Type
    string
    必選
    Description

    照片所呈現的內容,決定了像素畫的風格。這兩種風格看起來有明顯區別。傳入其他任何值都會回傳 400。

    可用取值:

    • person:人物,可以是肖像照或全身照。Meshy 會繪製 Q 版風格的像素精靈。
    • other:其他任何主體,例如寵物、物品、吉祥物、標誌或風景。Meshy 會繪製拼豆風格的像素圖示。
  • Name
    name
    Type
    string
    Description

    任務名稱,最多 100 個字元。該名稱會在任務的 name 欄位中回傳。名稱過長會回傳 400。

回傳值

result 欄位保存新建原型任務的 ID。取得該任務或以串流方式取得,直到 status 變為 SUCCEEDED。然後將該 ID 作為 input_task_id 傳給建構 endpoint。

失敗情況

  • Name
    400 - Bad Request
    Description

    請求無法執行。例如:

    • 缺少 image_url 或 type。
    • type 既不是 person 也不是 other。
    • 圖像不是 JPG、JPEG、PNG 或 WebP 檔案。
    • 圖像太小、超過 20 MB,或超過最大像素數。
    • Meshy 無法下載該圖像,例如因為該 URL 回傳 404 或請求逾時。
    • data URI 不是有效的 base64 編碼。
    • 該圖像被標記為 NSFW(不適宜工作場合內容)。

    錯誤訊息會說明具體發現了什麼問題。修正請求後重新傳送。

  • Name
    401 - Unauthorized
    Description

    API 金鑰缺失或無效。請檢查 Authorization 請求標頭。

  • Name
    402 - Payment Required
    Description

    以下情況之一適用:

    • 帳戶沒有足夠的積分。
    • API 金鑰、工作區或成員已達到其積分限額。
    • 帳戶處於免費方案。

    請檢查你的積分和方案,然後重試。

  • Name
    403 - Forbidden
    Description

    你的團隊已開啟 IP Filtering(智慧財產權過濾),Meshy 將該圖像標記為涉及第三方智慧財產權。請傳送你擁有使用權的圖像。

  • Name
    429 - Too Many Requests
    Description

    達到了以下限制之一:

    • 你傳送的請求數超過了速率限制所允許的數量。請等待幾秒鐘後重試。參閱速率限制。
    • 你排隊中或正在執行的任務過多。請等待部分任務完成後再重試。
    • 在沒有積分的無限量方案下,你已達到可在無積分情況下執行的任務數量上限。請等待某個任務完成,或增加積分。
  • Name
    500 - Internal Server Error
    Description

    Meshy 遇到了伺服器錯誤,例如無法對圖像執行智慧財產權檢查。Meshy 不會建立該任務,並會退還已扣除的所有積分。請重試該請求。


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

建立 Fidget Pixel 建構任務

根據一個成功的原型任務生成可用於 3D 列印的拼塊。Meshy 會將像素藝術圖像取樣到網格上,並將其壓縮為最多 color_count 種顏色。主體的每個單元格都會變成一個互鎖的拼塊,背景則不會被列印。

結果是一個單一的多色 3MF 檔案,可直接彩色列印。每個拼塊都有灰色的主體和與其像素顏色相同的頂部。關於其欄位,參見 Fidget Pixel 建構任務物件。

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"
}

參數

  • Name
    input_task_id
    Type
    string
    必選
    Description

    要建構的原型任務的 ID。它必須是你的帳戶使用 POST /openapi/creative-lab/fidget-pixel/v1/prototype 建立的任務,且狀態為 SUCCEEDED。

    如果該 ID 不是你透過 API 建立的 Fidget Pixel 原型任務之一,將回傳 404,這也包括在網頁應用程式中建立的原型。

  • Name
    name
    Type
    string
    Description

    任務的名稱,最多 100 個字元。它會在任務的 name 欄位中回傳。更長的名稱會回傳 400。

options

拼塊形狀和尺寸的設定。每個欄位都有預設值,因此只需傳送你想更改的欄位。0 表示使用該欄位的預設值。這些設定與 Creative Lab 網頁應用程式中的設定相同。其他形狀設定是固定的,Meshy 會根據 shape 和 piece_size_mm 來設定它們。

  • Name
    shape
    Type
    string
    預設值 square
    Description

    每個拼塊的外形。任何其他值都會回傳 400。

    可用值:

    • square: 方形網格上的方形拼塊
    • hex: 六邊形網格上的六邊形拼塊,此時 piece_size_mm 需設定為 6 或 8
  • Name
    grid_size
    Type
    integer
    預設值 32
    Description

    棋盤每邊的網格單元數,16 或 32。任何其他值都會回傳 400。32 網格能保留更多細節。16 網格生成的拼塊數量更少,但尺寸相同,因此棋盤的寬度約為一半。

  • Name
    piece_size_mm
    Type
    integer
    預設值 8
    Description

    每個拼塊的邊長(毫米),6、8 或 10。任何其他值都會回傳 400。結合 grid_size,它決定了列印出的棋盤尺寸。例如,一個 32 網格、邊長 8 毫米的拼塊組成的棋盤,每邊約為 26.5 公分。

    10 不能與 hex 一起使用,會回傳 400,因為在大多數消費級 FDM 印表機上,傾斜的六邊形面會出現懸空問題。

  • Name
    color_count
    Type
    integer
    預設值 8
    Description

    像素藝術調色盤中的最大顏色數,範圍從 1 到 8。超出該範圍的值會回傳 400。列印時,你最多需要 color_count 加一種耗材,每種顏色一種,再加一種用於灰色主體。

  • Name
    piece_height_mm
    Type
    integer
    預設值 15
    Description

    每個拼塊的高度(毫米),範圍從 10 到 80。超出該範圍的值會回傳 400。

output

結果檔案的設定。

  • Name
    format
    Type
    string
    預設值 3mf
    Description

    結果的檔案格式。任何其他值都會回傳 400。

    可用值:

    • 3mf: 一個多色 model.3mf 檔案,在 model_urls.3mf 中回傳

回傳值

result 欄位保存新建構任務的 ID。取得任務或對其進行串流取得,直到 status 為 SUCCEEDED。然後從 model_urls.3mf 下載 3MF 檔案。

失敗模式

  • Name
    400 - Bad Request
    Description

    請求無法執行。例如:

    • input_task_id 缺失或不是有效的任務 ID。
    • 原型任務的狀態不是 SUCCEEDED。如果它仍在執行,請等待後重試。如果它失敗或被取消,請建立一個新的原型任務。
    • 原型任務成功了,但沒有圖像。請建立一個新的原型任務。
    • 某個 options 欄位超出了其允許的值範圍,例如 grid_size 不是 16 或 32。
    • piece_size_mm 為 10 且 shape 為 hex。六邊形拼塊僅支援 6 毫米和 8 毫米。
    • output.format 不是 3mf。

    錯誤訊息會說明發現的具體問題。

  • Name
    401 - Unauthorized
    Description

    API 金鑰缺失或無效。請檢查 Authorization 請求標頭。

  • Name
    402 - Payment Required
    Description

    以下情況之一適用:

    • 帳戶的積分不足。
    • API 金鑰、工作區或成員已達到其積分限額。
    • 帳戶處於免費方案。

    請檢查你的積分和方案,然後重試。

  • Name
    403 - Forbidden
    Description

    你的團隊已開啟IP 過濾,且 Meshy 將該原型任務的圖像標記為涉及第三方智慧財產權。請使用你擁有使用權的圖像建立原型任務。

  • Name
    404 - Not Found
    Description

    input_task_id 與你的帳戶透過 API 建立的任何 Fidget Pixel 原型任務都不匹配。在網頁應用程式中建立的原型也會回傳 404。請傳送原型建立回應中的 result ID。

  • Name
    429 - Too Many Requests
    Description

    達到了以下某項限制:

    • 你傳送的請求數超過了速率限制所允許的數量。請等待幾秒鐘後重試。參見速率限制。
    • 排隊或正在執行的任務過多。請等待部分任務完成後重試。
    • 在無限制方案下且沒有剩餘積分時,你達到了無需積分即可執行的任務數量上限。請等待某個任務完成,或增加積分。
  • Name
    500 - Internal Server Error
    Description

    Meshy 遇到了伺服器錯誤,例如無法對原型任務的圖像執行智慧財產權檢查。Meshy 不會建立該任務,並會退還已收取的任何積分。請重試該請求。


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

取得 Fidget Pixel 任務

回傳一個 prototype 或 build 任務。路徑必須與任務所處的階段相符。透過 /prototype/:id 請求的 build 任務會回傳 404,透過 /build/:id 請求的 prototype 任務同樣也會回傳 404。

有關欄位說明,請參閱 Fidget Pixel prototype 任務物件 和 Fidget Pixel build 任務物件。

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=***"
  }
}

參數

  • Name
    id
    Type
    path
    Description

    建立回應中回傳的任務 ID。

回傳值

與路徑中階段相符的 prototype 任務物件 或 build 任務物件。

失敗模式

  • Name
    400 - Bad Request
    Description

    id 不是有效的任務 ID。請傳送建立回應中的 result ID。

  • Name
    403 - Forbidden
    Description

    你的團隊已開啟 IP Filtering,且 Meshy 判定該 prototype 任務所用的圖片涉及第三方智慧財產權問題。Build 任務以及 Enterprise 方案下的團隊不會出現此錯誤。請使用你擁有合法使用權的圖片來建立 prototype 任務。

  • Name
    404 - Not Found
    Description

    你的帳戶下不存在此 ID 對應的 Fidget Pixel 任務,或該任務所處的階段與路徑不符。請檢查 ID,並使用 /prototype 或 /build 以符合對應的任務。

  • Name
    500 - Internal Server Error
    Description

    Meshy 無法完成智慧財產權檢查。請重試該請求。


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

刪除 Fidget Pixel 任務

取消一個 Fidget Pixel 任務。取消 PENDING 任務會退還其積分。IN_PROGRESS 任務會被取消但不會退款,因為已經有工作程序開始處理該任務。處於最終狀態(SUCCEEDED、FAILED 或 CANCELED)的任務無法被取消。

路徑必須與任務所處的階段一致。例如,使用建置任務的 ID 對 /prototype/:id 執行 DELETE 會回傳 404。

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).

路徑參數

  • Name
    id
    Type
    path
    Description

    要取消的任務的 ID。

回傳值

回傳空回應主體的 204 No Content。

失敗情況

  • Name
    400 - Bad Request
    Description

    以下情況之一適用:

    • id 不是有效的任務 ID。請傳送建立回應中的 result ID。
    • 任務已處於最終狀態(SUCCEEDED、FAILED 或 CANCELED),因此無法取消。
  • Name
    404 - Not Found
    Description

    你的帳戶下沒有該 ID 對應的 Fidget Pixel 任務,或者任務所處的階段與路徑不符。請檢查 ID,並使用 /prototype 或 /build 來符合對應的任務。


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

流式取得 Fidget Pixel 任務

以 Server-Sent Events(SSE)的形式流式傳輸 Fidget Pixel 任務的更新。路徑必須與任務所處的階段相符。如果不相符,例如在 /prototype/:id/stream 中使用了 build 任務的 ID,串流會發送一個 status_code: 404 的 error 事件並關閉。如果 id 不是有效的任務 ID,也會發生同樣的情況,但 status_code 為 400。

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=***"
  }
}

參數

  • Name
    id
    Type
    path
    Description

    建立回應中回傳的任務 ID。

回傳值

回傳 prototype 或 build 任務物件的串流。每個事件都包含完整的任務物件,形式與 取得 Fidget Pixel 任務 回傳的一致。當任務處於 PENDING 或 IN_PROGRESS 狀態時,其輸出欄位仍為空(null、[] 或 {}),且 finished_at 為 null。

如果 IP 過濾 阻擋了任務的結果,串流會發送一個 error 事件代替,其中包含 get 請求本應回傳的 status_code。


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

列出 Fidget Pixel 任務

按頁返回你某個階段的 Fidget Pixel 任務,每次返回一頁。路徑決定階段:/prototype 僅返回原型任務,/build 僅返回建構任務。

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=***"
    ]
  }
]

路徑參數

  • Name
    stage
    Type
    path
    必選
    Description

    要列出的階段,prototype 或 build。

查詢參數

  • Name
    page_num
    Type
    integer
    預設值 1
    Description

    要返回的頁碼,範圍從 1 到 255。0 返回第一頁。超出 0 到 255 的值將返回 400。

  • Name
    page_size
    Type
    integer
    預設值 10
    Description

    每頁任務數量,最多 100。101 到 255 之間的值將返回 100 個任務,0 則使用預設值。超出 0 到 255 的值將返回 400。

  • Name
    sort_by
    Type
    string
    預設值 -created_at
    Description

    排序方式。

    可用值:

    • -created_at:最新優先
    • +created_at:最舊優先

返回值

一個陣列,包含與路徑中階段相符的原型任務物件或建構任務物件。


Fidget Pixel prototype 任務物件

prototype 任務會把一張照片轉換為像素畫圖像。要把該圖像轉換為可 3D 列印的拼塊,請將該任務的 ID 作為 input_task_id 傳給建置 endpoint。

屬性

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=***"
  ]
}
  • Name
    id
    Type
    string
    Description

    任務 ID。不要依賴其格式。

  • Name
    type
    Type
    string
    Description

    任務類型,始終為 creative-lab-fidget-pixel-prototype。

  • Name
    name
    Type
    string
    Description

    你在建立任務時傳入的 name;如果未傳入,則為 ""。

  • Name
    status
    Type
    string
    Description

    任務的狀態。

    可選值:

    • PENDING:正在佇列中等待
    • IN_PROGRESS:正在產生結果
    • SUCCEEDED:最終狀態,已產生結果
    • FAILED:最終狀態,失敗原因見 task_error
    • CANCELED:最終狀態,沒有結果
  • Name
    progress
    Type
    integer
    Description

    任務完成的百分比,範圍從 0 到 100。任務開始前為 0,成功後為 100。

  • Name
    created_at
    Type
    timestamp
    Description

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

  • Name
    started_at
    Type
    timestamp
    Description

    工作程序開始處理任務的時間,單位為 Unix 毫秒。在此之前為 null。

  • Name
    finished_at
    Type
    timestamp
    Description

    任務到達最終狀態的時間,單位為 Unix 毫秒。在此之前為 null。

  • Name
    expires_at
    Type
    timestamp
    Description

    任務結果過期的時間,單位為 Unix 毫秒。該時間為 finished_at 之後 3 天;在任務完成之前,則為 created_at 之後 3 天。對於會無限期保留 API 結果的企業帳戶,該時間約為 100 年後。參見資產保留期。

  • Name
    preceding_tasks
    Type
    integer
    Description

    任務處於 PENDING 狀態時在佇列中的位置。1 表示該任務將是下一個開始的任務。任務離開佇列後為 0,在列表結果中也始終為 0。

  • Name
    task_error
    Type
    object
    Description

    任務失敗的原因。除非 status 為 FAILED,否則為 null。參見 錯誤。

  • Name
    consumed_credits
    Type
    integer
    Description

    該任務扣除的積分數量(已計入任何退款)。回傳錯誤的請求不會被扣費。失敗的任務為 0,因為 Meshy 會退還積分。只有在任務處於 PENDING 狀態時取消,才會退還積分。如果 Meshy 無法讀取扣費資訊,取得或串流回應中會省略該欄位,而列表請求會回傳 500。遇到這種情況,請重試請求。

  • Name
    image_urls
    Type
    array of strings
    Description

    像素畫圖像的下載連結。任務成功後,該陣列中會包含一個 URL;在此之前為空陣列。

    這些 URL 都是經過簽署的,取得時無需帶 Authorization 請求標頭。它們在 expires_at 之前一直有效。在此之前再次取得該任務,回傳的仍是相同的 URL,而不是重新簽署的 URL。過期的 URL 無法刷新,因此請在此之前下載並儲存好檔案。


Fidget Pixel 建置任務物件

建置任務會根據已成功的原型任務生成可供 3D 列印的拼塊。Meshy 會將像素風圖像採樣到網格上,並以單一多色 3MF 檔案回傳這些拼塊。

屬性

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=***"
  }
}
  • Name
    id
    Type
    string
    Description

    任務 ID。請勿依賴其格式。

  • Name
    type
    Type
    string
    Description

    任務類型,始終為 creative-lab-fidget-pixel-build。

  • Name
    name
    Type
    string
    Description

    你建立任務時傳送的 name,如果未傳送則為 ""。

  • Name
    status
    Type
    string
    Description

    任務的狀態。

    可用的值:

    • PENDING:正在佇列中等待
    • IN_PROGRESS:正在生成結果
    • SUCCEEDED:最終狀態,已有結果
    • FAILED:最終狀態,原因見 task_error
    • CANCELED:最終狀態,沒有結果
  • Name
    progress
    Type
    integer
    Description

    已完成工作的百分比,範圍從 0 到 100。任務開始前為 0,成功後為 100。

  • Name
    created_at
    Type
    timestamp
    Description

    任務建立的時間,以 Unix 毫秒表示。

  • Name
    started_at
    Type
    timestamp
    Description

    工作程序開始執行任務的時間,以 Unix 毫秒表示。在此之前為 null。

  • Name
    finished_at
    Type
    timestamp
    Description

    任務到達最終狀態的時間,以 Unix 毫秒表示。在此之前為 null。

  • Name
    expires_at
    Type
    timestamp
    Description

    任務結果過期的時間,以 Unix 毫秒表示。它是 finished_at 之後 3 天,或在任務完成之前是 created_at 之後 3 天。對於無限期保留 API 結果的企業版帳戶,這個時間大約是 100 年之後。請參閱資產保留期。

  • Name
    preceding_tasks
    Type
    integer
    Description

    任務處於 PENDING 狀態時在佇列中的位置。1 表示它將是下一個開始的任務。任務離開佇列後為 0,在列表結果中始終為 0。

  • Name
    task_error
    Type
    object
    Description

    任務失敗的原因。除非 status 為 FAILED,否則為 null。請參閱 Errors。

  • Name
    consumed_credits
    Type
    integer
    Description

    任務所扣除的積分數量,已扣除任何退款。回傳錯誤的請求不會被扣費。失敗的任務為 0,因為 Meshy 會退還費用。取消任務只有在其處於 PENDING 狀態時才會退款。如果 Meshy 無法讀取扣費資訊,取得或串流傳輸回應會省略該欄位,而列表請求會回傳 500。在這種情況下,請重試該請求。

  • Name
    model_urls
    Type
    object
    Description

    結果的下載 URL,以檔案格式作為鍵。該物件包含一個項目,對應你所傳送的 output.format,在任務成功之前為空。

    這些 URL 是經過簽署的,因此取得時無需攜帶 Authorization 請求標頭。它們在 expires_at 之前一直有效。在此之前再次取得該任務會回傳相同的 URL,而不是重新簽署的 URL。過期的 URL 無法重新整理,因此請在過期前下載並儲存這些檔案。

    • Name
      3mf
      Type
      string
      Description

      多色 3MF 檔案的下載 URL。每個拼塊都有一個灰色主體和一個帶有其像素顏色的頂部。當 output.format 為 3mf(預設值)時存在。


端到端範例

以下 cURL 和 Python 腳本執行整個流程。每個腳本都會根據一張照片建立一個 prototype 任務並等待其成功完成。然後建立一個 build 任務,等待該任務完成,並從 model_urls.3mf 下載 3MF 檔案。

cURL 腳本需要 curl 和 jq,Python 腳本需要 requests 套件。要執行腳本,請按以下步驟操作:

  1. 將 MESHY_API_KEY 設為你的 API 金鑰。
  2. 將 IMAGE_PATH 設為本機照片的路徑,或將 IMAGE_URL 設為公開可存取的圖片 URL。
  3. 選用:如果要像素化的主體不是人物,請將 PIXEL_TYPE 設為 other。
  4. 執行腳本。

prototype 任務通常會在幾分鐘內完成。build 任務通常會在不到一分鐘內完成。

在你的應用程式中,在建立 build 任務之前,先向使用者展示 image_urls 中的圖片。如果他們不喜歡,就改為再建立一個 prototype 任務。這樣,你只會在使用者認可的圖片上花費 build 積分。

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"