Creative Lab — Fidget Pixel API
元となる写真を、複数色に対応した3Dプリント可能なピクセルアート風フィジェットボードへと変換します。処理は2段階に分かれており、prototype(プロトタイプ)では写真をピクセルアート画像へと変換し、続くbuild(ビルド)ではその画像を16×16または32×32のグリッドへサンプリングして、各ピクセルを噛み合う正方形または六角形のピースへと変換します。最終的に、各オブジェクトが色情報を保持した単一の3MFとして出力されるため、マルチフィラメント対応のスライサーで各ピースを正しい色で印刷できます。この2つの段階はinput_task_idを通じて連携します。
POST /openapi/creative-lab/fidget-pixel/v1/prototypePOST /openapi/creative-lab/fidget-pixel/v1/build
どちらのPOSTエンドポイントも有料のサブスクリプションプランが必要です。無料プランのアカウントからのリクエストは402 Payment Requiredで拒否されます。
Fidget Pixel プロトタイプタスクの作成
元の写真から単一のピクセルアート画像を生成します。返されるタスク
ID は、build エンドポイントに input_task_id として渡すものです。結果が望んだものでない場合は、この
エンドポイントを再度呼び出して別のテイクを生成してください — 各
呼び出しは個別に課金されます。レスポンスの形については
The Fidget Pixel Prototype Task Object
を参照してください。
パラメータ
- Name
- image_url
- Type
- string
- 必須
- Description
Meshy がピクセル化する元の写真。現在サポートしている形式は
.jpg、.jpeg、.png、.webpです。形式は画像データをデコードすることで検出され、URL のファイル拡張子からは判定されません — 拡張子のない URL や、リダイレクトする URL であっても、バイトデータがサポート対象の形式にデコードできる限り問題なく動作します。HTTP リダイレクトはたどられます。
画像を指定する方法は2つあります。
- 公開アクセス可能な URL: インターネット上から公開アクセス可能な URL。
- Data URI: 画像を base64 エンコードした data URI。data URI の例:
data:image/jpeg;base64,<your base64-encoded image data>。
- Name
- type
- Type
- string
- 必須
- Description
写真に写っているものを指定します。ピクセル化のスタイルを選択するため、慎重に選んでください — この2つは見た目に明確な違いのある結果を生成します。指定可能な値:
person— 被写体が人物(ポートレートまたは全身)の場合。被写体のちびキャラ風ピクセルスプライトを生成します。other— それ以外のすべて: ペット、物体、マスコット、ロゴ、風景。被写体のビーズアート風ピクセルアイコンを生成します。
- Name
- name
- Type
- string
- Description
表示用の任意のタスク名。最大100文字。
返り値
レスポンスの result プロパティには、新しく作成された fidget pixel プロトタイプタスクのタスク id が含まれます。Get a Task エンドポイントをポーリングするか、stream を購読して、タスクが SUCCEEDED になるまで待ってから、その ID を build endpoint に input_task_id として渡してください。
失敗モード
- Name
400 - Bad Request- Description
リクエストが受理できませんでした。よくある原因:
- パラメータ不足:
image_urlとtypeはどちらも必須です。 - 無効な type:
typeはpersonまたはotherである必要があります。 - 無効な画像形式: 指定された
image_urlがサポート対象の形式(.jpg、.jpeg、.png、.webp)ではありません。 - 画像サイズが範囲外: 画像が小さすぎる、最大ファイルサイズを超えている、または最大ピクセル数を超えています。
- URL に到達不可:
image_urlをダウンロードできませんでした(404 または timeout)。 - 無効な Data URI: base64 文字列が不正な形式です。
- コンテンツがフラグ付けされた: 入力画像が NSFW moderation によってフラグ付けされました。
- パラメータ不足:
- Name
401 - Unauthorized- Description
認証に失敗しました。APIキーを確認してください。
- Name
402 - Payment Required- Description
このタスクを実行するためのクレジットが不足しているか、APIキーが無料プランのアカウントに属しています。
- Name
403 - Forbidden- Description
入力画像が知的財産 moderation によってフラグ付けされました(
Content flagged for intellectual property violation)。知的財産フィルタリングが有効な Enterprise アカウントのみがブロックされ、課金は発生しません。
- Name
429 - Too Many Requests- Description
レート制限を超過しました。
- Name
500 - Internal Server Error- Description
知的財産チェック自体を完了できませんでした(
Unable to perform intellectual property check, please try again)。知的財産フィルタリングが有効な Enterprise アカウントは、このチェックで失敗した場合にフェイルクローズします — 課金は発生しませんので、リクエストを再試行してください。
Request
# 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"
}
Fidget Pixel ビルドタスクを作成する
成功したプロトタイプタスクから3Dプリント可能なピースを生成します。ビルドはプロトタイプのピクセルアート画像を指定されたグリッドにサンプリングし、最大color_count色に量子化して、グリッドセルごとに1つの噛み合うピースを生成します。成果物は単一の3MFファイルであり、その中では各ピースが色をタグ付けされた個別のオブジェクトとなっており、マルチフィラメント対応のスライサーですぐに使用できます。レスポンスの形式については、
Fidget Pixel ビルドタスクオブジェクト
を参照してください。
パラメータ
- Name
- input_task_id
- Type
- string
- 必須
- Description
同じOpenAPIエンドポイント経由で作成されたプロトタイプタスクのタスクIDです。プロトタイプは同じMeshyアカウントによって作成され、
SUCCEEDEDに到達している必要があります。webapp経由で作成されたプロトタイプタスクは受け付けられません——ビルドエンドポイントは
POST /openapi/creative-lab/fidget-pixel/v1/prototypeによって生成されたプロトタイプタスクのみを受け付け、それ以外のソースは404で拒否します。
- Name
- name
- Type
- string
- Description
表示用のオプションのタスク名です。最大100文字です。
options
オプションのピースジオメトリです。各フィールドにはデフォルト値があります——上書きしたいものだけを送信してください。これらはCreative Lab webappが公開しているものと同じコントロールです。プラグの高さ、キャップスケール、その他の製造プリセットはshapeとpiece_size_mmから導出され、公開されていません。
- Name
- shape
- Type
- string
- デフォルト square
- Description
各ピースのフットプリントです。使用可能な値:
square(デフォルト)— 正方形グリッド上の正方形ピース。hex— 六角形グリッド上の六角形ピース。六角形ピースは6mmと8mmのみで使用可能です。
- Name
- grid_size
- Type
- integer
- デフォルト 32
- Description
ボードの各辺に沿ったピースの数です。使用可能な値:
16または32。32グリッドはより多くのディテールを保持し、16グリッドは同じ被写体に対してより少なく大きなピースになります。
- Name
- piece_size_mm
- Type
- integer
- デフォルト 8
- Description
各ピースの辺の長さ(ミリメートル単位)です。使用可能な値:
6、8、または10。grid_sizeと組み合わせることで、印刷されるボードのサイズが決まります——例えば32 × 8 mm ≈ 1辺26 cmになります。10はshape: "hex"では使用できません(斜めの六角形の面はほとんどの一般消費者向けFDMプリンターでオーバーハングになります)。
- Name
- color_count
- Type
- integer
- デフォルト 8
- Description
画像が量子化されるパレットの最大色数です。範囲:
[1, 8]。各色はスライサーで1つのフィラメントになります。
- Name
- piece_height_mm
- Type
- integer
- デフォルト 15
- Description
各ピースの高さ(ミリメートル単位)です。範囲:
[10, 80]。
output
オプションの出力形式セレクターです。デフォルトは3mfで、現時点でこれが唯一サポートされている値です。
- Name
- format
- Type
- string
- デフォルト 3mf
- Description
ビルドによって返される成果物です。使用可能な値:
3mf(デフォルト)—model_urls.3mfの下に単一のmodel.3mfを返します。ピースごとに1つのオブジェクトがあり、各オブジェクトにピースの色が付加されています。
戻り値
レスポンスのresultプロパティには、新しく作成されたfidget pixelビルドタスクのタスクidが含まれます。タスクがSUCCEEDEDに到達するまでタスクを取得するエンドポイントをポーリングするか、ストリームを購読し、その後model_urls.3mfから成果物をダウンロードしてください。
失敗モード
- Name
400 - Bad Request- Description
リクエストが受け付けられませんでした。一般的な原因:
- パラメータの欠落:
input_task_idは必須です。 - 無効なUUID:
input_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キーを確認してください。
- Name
402 - Payment Required- Description
このタスクを実行するためのクレジットが不足しているか、APIキーが無料プランのアカウントに属しています。
- Name
403 - Forbidden- Description
参照されているプロトタイプの画像が知的財産moderationによってフラグ付けされました。知的財産フィルタリングが有効なEnterpriseアカウントのみがブロックされます。料金は請求されません。
- Name
404 - Not Found- Description
参照されているプロトタイプタスクが存在しない、別のユーザーに属している、またはwebapp経由で作成されています(API modeのプロトタイプタスクのみがビルドに連鎖できます)。
- Name
429 - Too Many Requests- Description
レート制限を超えました。
- Name
500 - Internal Server Error- Description
参照されているプロトタイプの知的財産の判定を確立できませんでした(
Unable to perform intellectual property check, please try again)。知的財産フィルタリングが有効なEnterpriseアカウントは、このチェックで失敗した場合にフェイルクローズします。料金は請求されません——リクエストを再試行してください。
Request
# 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"
}
Fidget Pixel タスクを取得
有効なタスク id を指定して、プロトタイプまたはビルドのタスクを取得します。URLパスは
タスクのステージと一致している必要があります — /prototype/:id を通じて
ビルドタスクを取得した場合は 404 が返され、その逆も同様です。
レスポンスの形式については、The Fidget Pixel Prototype Task Object および The Fidget Pixel Build Task Object を参照してください。
パラメータ
- Name
- id
- Type
- path
- Description
取得対象の fidget pixel タスクを識別する一意の識別子です。
戻り値
レスポンスには fidget pixel タスクオブジェクトが含まれます。その形式は リクエストされたステージによって異なります。
失敗モード
- Name
400 - Bad Request- Description
idが有効なUUIDではありません(Invalid ID)。
- Name
403 - Forbidden- Description
タスクの画像が知的財産モデレーションによってフラグ付けされました。知的財産フィルタリングが有効なEnterpriseアカウントのみがブロックされます。
- Name
404 - Not Found- Description
タスクが存在しない、別のユーザーに属している、またはそのステージがURLパスと一致していません。
- Name
500 - Internal Server Error- Description
知的財産チェックを完了できませんでした(
Unable to perform intellectual property check, please try again)。知的財産フィルタリングが有効なEnterpriseアカウントはフェイルクローズ(安全側に倒して失敗)となります。リクエストを再試行してください。
Request
# 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=***"
}
}
Fidget Pixel タスクを削除する
fidget pixel タスクをキャンセルします。タスクがまだ PENDING の場合、作成時に消費されたクレジットは払い戻されます。すでに
IN_PROGRESS のタスクは、払い戻しなしでキャンセルされます(ワーカーがすでにリソースを消費している可能性があるため)。
すでに終了状態(SUCCEEDED、FAILED、CANCELED)に達しているタスクはキャンセルできません。
URL パスはタスクのステージと一致している必要があります。/prototype/:buildId に対する DELETE は
404 を返します。
パスパラメータ
- Name
- id
- Type
- path
- Description
キャンセルする fidget pixel タスクの一意の識別子。
戻り値
成功時は空のボディとともに 204 No Content を返します。
失敗モード
- Name
400 - Bad Request- Description
リクエストが受け入れられませんでした。よくある原因:
- 無効な ID:
idが有効な UUID ではありません。 - 終了状態:タスクがすでに
SUCCEEDED、FAILED、またはCANCELEDであり、キャンセルできません。
- 無効な ID:
- Name
404 - Not Found- Description
タスクが存在しない、別のユーザーに属している、またはそのステージが URL パスと一致していません。
Request
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).
Fidget Pixel タスクをストリーミングする
Server-Sent Events (SSE) を介して、fidget pixel タスクのリアルタイム更新をストリーミングします。
URLパスはタスクのステージと一致している必要があります —
/prototype/:buildId/stream でストリームを開くと、status_code: 404 を持つ単一の
event: error ペイロードが発行され、ストリームは閉じられます。不正な形式の id の場合も同様に、
status_code: 400(Invalid ID)で同じ動作となります。
パラメータ
- Name
- id
- Type
- path
- Description
ストリーミング対象の fidget pixel タスクを識別する一意のIDです。
戻り値
Server-Sent Events として、Fidget Pixel Prototype
または Fidget Pixel Build タスクオブジェクトのストリームを返します。
各フレームには、そのステージの完全なタスクオブジェクトが含まれます — これは Get
エンドポイントが返すものと同じ形状です — そのため、タスクが PENDING または IN_PROGRESS の間、
出力フィールドはまだ入力されておらず(null、[]、または {})、
finished_at は null です。
Request
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=***"
}
}
Fidget Pixel タスク一覧の取得
単一のステージにおけるfidget pixelタスクのページ分割されたリストを取得します。
URLパスがステージを選択します — /prototypeはプロトタイプタスクを返し、
/buildはビルドタスクを返します。もう一方のステージのタスクは、
どちらのレスポンスにも含まれません。
パスパラメータ
- Name
- stage
- Type
- path
- 必須
- Description
prototypeまたはbuildのいずれかです。このコレクションは、URLに一致する ステージのタスクのみを返します —/prototypeを取得してもビルドタスクが 返されることはなく、その逆も同様です。
クエリパラメータ
- 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を
リストする場合はfidget pixelプロトタイプタスクオブジェクト、
/buildをリストする場合は
fidget pixelビルドタスクオブジェクトです。
Request
# 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=***"
]
}
]
The Fidget Pixel Prototype Task Object
Fidget Pixel Prototype Task オブジェクトは、元となる写真をピクセルアートの画像にピクセル化するために Meshy が管理するワークユニットです。このステージの出力は、input_task_id を介してビルドステージへと連結されます。
プロパティ
- Name
- id
- Type
- string
- Description
タスクの一意な識別子です。実装の詳細としてタスク id には k-sortable UUID を使用していますが、id の形式についていかなる前提も置かないようにしてください。
- Name
- type
- Type
- string
- Description
タスクの種類です。値は
creative-lab-fidget-pixel-prototypeです。
- Name
- name
- Type
- string
- Description
タスク作成時に指定されたタスク名です。名前が指定されなかった場合は空文字列になります。
- 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
タスクが作成された時刻のタイムスタンプ(ミリ秒単位)です。
タイムスタンプは、RFC 3339
規格に従い、1970年1月1日 UTC からの経過ミリ秒数を表します。 たとえば、2023年9月1日金曜日 12:00:00 PM GMT は1693569600000と表されます。これは Meshy API におけるすべてのタイムスタンプに当てはまります。
- Name
- started_at
- Type
- timestamp
- Description
タスクが開始された時刻のタイムスタンプ(ミリ秒単位)です。タスクがまだ開始されていない場合、このプロパティは
nullになります。
- Name
- finished_at
- Type
- timestamp
- Description
タスクが終了した時刻のタイムスタンプ(ミリ秒単位)です。タスクがまだ終了していない場合、このプロパティは
nullになります。
- Name
- expires_at
- Type
- timestamp
- Description
タスクの結果が失効する時刻のタイムスタンプ(ミリ秒単位)です — タスク終了から3日後です。Enterprise アカウントは API の結果を無期限に保持します(アセット保持期間を参照)。その場合、このタイムスタンプは約100年先に設定されます。
- Name
- preceding_tasks
- Type
- integer
- Description
先行するタスクの数です。
このフィールドの値は、タスクのステータスが
PENDINGの場合にのみ意味を持ちます。
- Name
- task_error
- Type
- object
- Description
失敗したタスクのエラー詳細です。
task_errorオブジェクトの完全なリファレンスについては、エラーを参照してください。
- Name
- consumed_credits
- Type
- integer
- Description
このタスクによって消費されたクレジットの数です。
SUCCEEDEDに達したタスクは、そのステージの全額が請求されます。作成すら行われなかったタスク(リクエスト時の4xx、moderation による却下を含む)には一切請求されません。FAILEDに達したタスクは0を返します — 請求分は返金されます。DELETEによるキャンセルは、タスクがまだPENDINGの間のみ返金されます。すでにIN_PROGRESSのタスクは、作業が消費済みであるため課金されたままです。
- Name
- image_urls
- Type
- array of strings
- Description
このプロトタイプタスクによって生成されたピクセルアート画像のダウンロード可能な URL です。現在、API は常にちょうど1枚の画像を返しますが、将来のリビジョンで破壊的変更なしに複数の候補を提供できるよう、このフィールドは配列になっています。タスクが
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=***"
]
}
The Fidget Pixel Build Task Object
Fidget Pixel Build Taskオブジェクトは、成功したプロトタイプタスクから印刷可能なパーツを生成するために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
タスクのステータス。取り得る値は
PENDING、IN_PROGRESS、SUCCEEDED、FAILED、CANCELEDのいずれかです。
- 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オブジェクトの完全なリファレンスについてはエラーを参照してください。
- Name
- consumed_credits
- Type
- integer
- Description
このタスクによって消費されたクレジットの数。
SUCCEEDEDに到達したタスクは、そのステージの全額が課金されます。作成に至らなかったタスク(リクエスト時の4xx、moderationによる拒否を含む)はまったく課金されません。FAILEDに到達したタスクは0を返します — 課金分は返金されます。DELETEによるキャンセルは、タスクがまだPENDINGである間のみ返金されます。すでにIN_PROGRESSのタスクは、作業がすでに消費されているため課金されたままとなります。
- Name
- model_urls
- Type
- object
- Description
生成されたアセットのダウンロード可能なURLで、フォーマットごとにキー付けされています。ビルドリクエストの
output.formatで要求されたフォーマットに対応するエントリを1つだけ含みます。タスクがSUCCEEDEDに到達するまでは空です。これらは署名付きURLです。
Authorizationヘッダーなしで取得してください。これらはexpires_at(finished_atの3日後)まで有効であり、その期間内にタスクを再読み込みすると、新しく署名されたURLではなく同一のURLが返されます。期限切れになる前に、自分でファイルをダウンロードして保存してください。期限切れになったリンクを更新する方法はありません。- Name
3mf- Type
- string
- Description
3MFファイルへのダウンロード可能なURL。ピースごとに1つのオブジェクトがあり、それぞれにパレットの色がタグ付けされているため、マルチフィラメント対応のスライサーが色ごとにフィラメントを割り当てます。
output.formatが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=***"
}
}
エンドツーエンドの例
完全なフロー: 写真からプロトタイプを作成し、SUCCEEDED になるまでポーリングし、そこからビルドを作成し、ビルドが SUCCEEDED になるまでポーリングしてから、model_urls から3MFをダウンロードします。
プロトタイプは通常数分以内に完了し、ビルドは通常1分未満で完了します。実際の統合では、ビルドにクレジットを費やす前に、エンドユーザーにプロトタイプの image_urls エントリを表示し、確認(またはプロトタイプの再実行)をさせるようにします。
Complete flow
#!/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"