Creative Lab — キーキャップAPI
ソース写真をフルカラーのカスタムメカニカルキーボードキーキャップに変換するには、2つのステージがあります。プロトタイプは、入力写真から「完成したキーキャップ」デザインのレンダリングを生成します。そのレンダリングを確認したら、ビルドはそれをテクスチャ付き3Dキーキャップモデルに単一の実行で変換します。ホワイトモデルの生成、キャリブレーションされたデフォルトポーズでの自動配置とカット、フルモデルの着色、最終組み立てがすべて1つのビルドタスク内で行われます。2つのステージはinput_task_idとcandidate_idでリンクされています。
POST /openapi/creative-lab/keycap/v1/prototypePOST /openapi/creative-lab/keycap/v1/build
両方のPOST endpointは、有料のサブスクリプションプランが必要です。無料プランのアカウントからのリクエストは402 Payment Requiredで拒否されます。
キーキャッププロトタイプタスクの作成
ソース写真から完成したキーキャップデザインのレンダーを生成します。タスクの結果は、image_urls 配列(完成したキーキャップの表示レンダー)と並行する candidate_ids 配列を持ち、どちらも単一のエントリを保持します。結果が望むものでない場合は、このエンドポイントを再度呼び出してください — 各呼び出しは別途請求されます。candidate_id をプロトタイプタスクIDと共に ビルドエンドポイント に渡します。レスポンスの形状については キーキャッププロトタイプタスクオブジェクト を参照してください。
パラメータ
- Name
- image_url
- Type
- string
- 必須
- Description
Meshyがキーキャップデザイン画像に変換するためのソース写真です。現在、
.jpg、.jpeg、.png、および.webpフォーマットをサポートしています。フォーマットは画像データをデコードすることで検出され、URLのファイル拡張子からではありません — 拡張子がないURLやリダイレクトするURLでも、バイトがサポートされているフォーマットにデコードされる限り動作します。HTTPリダイレクトは追跡されます。EXIFの向きは正規化されているため、回転した携帯電話の写真は見た目通りに使用されます。
制限: 各辺が少なくとも
32ピクセル、合計で最大178,956,970ピクセル、ダウンロード後の最大20,000,000バイトです。Data URIの場合、制限はデコードされたバイトに適用されるため、ソースファイル自体はそのサイズまで可能です — base64テキストは約3分の1大きくなり、リクエストボディには影響しますが、この制限には影響しません。Data URIはimage/*コンテンツタイプと;base64を宣言する必要があります。画像を提供する方法は2つあります:
- 公開アクセス可能なURL: 公開インターネットからアクセス可能なURL。
- Data URI: 画像のbase64エンコードされたData URI。Data URIの例:
data:image/jpeg;base64,<your base64-encoded image data>。
- Name
- name
- Type
- string
- Description
表示目的のためのオプションのタスク名。最大100文字。
- Name
- remove_background
- Type
- boolean
- デフォルト false
- Description
trueに設定すると、image_urlsで返される表示レンダーは背景が削除された透明なRGBA PNGになり、任意の背景に合成できます。これは表示レンダーにのみ適用されます。ビルドエンドポイントが消費する候補は影響を受けないため、3D結果はどちらの場合も同一です。
戻り値
レスポンスの result プロパティには、新しく作成されたキーキャッププロトタイプタスクのタスク id が含まれています。タスクの取得 エンドポイントをポーリングするか、タスクが SUCCEEDED に達するまで ストリーム にサブスクライブし、その後 candidate_ids からエントリを取り出し、タスクIDと共に ビルドエンドポイント に渡します。
失敗モード
- Name
400 - Bad Request- Description
リクエストが受け入れられませんでした。一般的な原因:
- パラメータの欠如:
image_urlが必要です。 - 無効な画像フォーマット: 提供された
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
アカウントが無料プランである(タスクを作成するには有料プランが必要)か、クレジットが不足しています。
- Name
403 - Forbidden- Description
入力画像が知的財産moderationによってフラグされました。
- Name
429 - Too Many Requests- Description
レート制限を超えました。
- Name
500 - Internal Server Error- Description
予期しないサーバー側のエラーが発生しました — 例えば、コンテンツmoderationサービスが利用できなかった、入力画像のステージングに失敗した、またはタスクを作成できなかったなど。この場合、タスクは作成されないため、再試行は安全です。
Request
# Stage 1: generate a finished-keycap design render
curl https://api.meshy.ai/openapi/creative-lab/keycap/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>"
}'
Response
{
"result": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef"
}
キーキャップビルドタスクを作成する
成功したプロトタイプタスクとその候補の1つから、最終的なテクスチャ付き3Dキーキャップモデルを生成します。単一のビルドタスクが全体のパイプラインをエンドツーエンドで実行します — 選択されたデザインからのホワイトモデル生成、キャリブレーションされたデフォルトポーズを使用したキーキャップベースへの自動配置とカット(インタラクティブな調整は不要)、フルモデルの着色、最終組み立てとエクスポート。ビルドは通常3〜7分かかり、複数のビルドが同時に実行される場合は上限に近づきます。 キーキャップビルドタスクオブジェクトを参照して、レスポンスの形状を確認してください。
パラメータ
- Name
- input_task_id
- Type
- string
- 必須
- Description
この同じOpenAPIエンドポイントを介して作成されたプロトタイプタスクのタスクID。プロトタイプは同じMeshyアカウントによって作成され、
SUCCEEDEDに達し、少なくとも1つの候補を生成している必要があります。Webアプリを通じて作成されたプロトタイプタスクは受け入れられません — ビルドエンドポイントは
POST /openapi/creative-lab/keycap/v1/prototypeによって生成されたプロトタイプタスクのみを受け入れ、他のソースは404で拒否されます。
- Name
- candidate_id
- Type
- string
- 必須
- Description
成功したプロトタイプタスクの
candidate_ids配列から取得されたビルドする候補。このタスクに属している必要があります。他の値は400で拒否されます。
- Name
- name
- Type
- string
- Description
表示目的のためのオプションのタスク名。最大100文字。
options
オプションのジオメトリ調整。すべてのフィールドにはキャリブレーションされたデフォルトがあります — 上書きしたいものだけを送信してください。
- Name
- base_model
- Type
- string
- デフォルト cherry-mx-1x1-r1
- Description
ビルドするキーキャップベース。現在利用可能な唯一の値は
cherry-mx-1x1-r1です — 標準のCherry MXプロファイル1uキーキャップ。3〜5の追加の主流標準サイズが計画されていますが、カスタムサイズはサポートされていません。
- Name
- head_size_mm
- Type
- number
- デフォルト 23
- Description
彫刻されたヘッドの目標サイズ(ミリメートル単位):その最長寸法がこの値にスケーリングされます。範囲:
[10, 40]。約32.9を超える値は、ヘッドがベースの保護フットプリント制限に収まるように縮小される可能性があるため、配信された最長寸法は要求されたものより小さくなることがあります。適用された値は今日のタスクオブジェクトにエコーバックされません — 実際に受け取ったサイズを確認する必要がある場合は、ダウンロードしたモデルのkeycap-headメッシュのバウンディングボックスを測定してください。
- Name
- vertical_offset_mm
- Type
- number
- デフォルト 0
- Description
ベースに配置される前にヘッドに適用される垂直オフセット(ミリメートル単位)。範囲:
[-5, 5]。
戻り値
レスポンスのresultプロパティには、新しく作成されたキーキャップビルドタスクのタスクidが含まれています。タスクを取得するエンドポイントをポーリングするか、タスクがSUCCEEDEDに達するまでストリームを購読し、model_urls.glbおよびmodel_urls.obj_zipからアーティファクトをダウンロードしてください。
GLBとOBJバンドルはどちらも実世界のミリメートルスケールでエクスポートされ、Y-up座標系を持ち、キーキャップの前面が**+Z**を向いています。
失敗モード
- Name
400 - Bad Request- Description
リクエストは受け入れられませんでした。一般的な原因:
- パラメータが不足しています:
input_task_idとcandidate_idは必須です。 - 無効なUUID:
input_task_idが有効なUUIDではありません。 - 親が成功していない: 参照されたプロトタイプタスクがまだ
SUCCEEDEDに達していません。 - 候補がない: プロトタイプタスクは成功しましたが、候補を生成しませんでした。
- 不明な候補:
candidate_idが入力タスクの候補の1つではありません。 - 範囲外のオプション:
optionsフィールドの1つが許可された範囲または列挙セットを超えました。
- パラメータが不足しています:
- Name
401 - Unauthorized- Description
認証に失敗しました。APIキーを確認してください。
- Name
402 - Payment Required- Description
アカウントが無料プランにある(タスクを作成するには有料プランが必要)か、クレジットが不足しています。
- Name
404 - Not Found- Description
参照されたプロトタイプタスクが存在しない、異なるユーザーに属している、またはWebアプリを通じて作成された(APIモードのプロトタイプタスクのみがビルドにチェーンされます)。
- Name
429 - Too Many Requests- Description
レート制限を超えました。
- Name
500 - Internal Server Error- Description
予期しないサーバー側のエラーが発生しました — たとえば、コンテンツモデレーションサービスが利用できなかった、入力画像のステージングに失敗した、またはタスクを作成できなかった場合です。この場合、タスクは作成されないため、再試行は安全です。
Request
# Stage 2: build the chosen candidate into a 3D keycap
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/build \
-X POST \
-H "Authorization: Bearer ${YOUR_API_KEY}" \
-H 'Content-Type: application/json' \
-d '{
"input_task_id": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef",
"candidate_id": "0198c1b2-33f5-7d21-a4b7-8e9d0c1f2a3b",
"options": {
"base_model": "cherry-mx-1x1-r1",
"head_size_mm": 23,
"vertical_offset_mm": 0
}
}'
Response
{
"result": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af"
}
キーキャップタスクを取得する
有効なタスクidを指定して、プロトタイプまたはビルドタスクを取得します。URLパスはタスクのステージに一致している必要があります。/prototype/:idを通じてビルドタスクを取得すると404が返され、その逆も同様です。
キーキャッププロトタイプタスクオブジェクトおよびキーキャップビルドタスクオブジェクトを参照して、レスポンスの形状を確認してください。
パラメータ
- Name
- id
- Type
- path
- Description
取得するキーキャップタスクの一意の識別子。
戻り値
レスポンスにはキーキャップタスクオブジェクトが含まれます。形状は要求されたステージに依存します。
リクエスト
# Prototype
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/prototype/019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef \
-H "Authorization: Bearer ${YOUR_API_KEY}"
# Build
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/build/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af \
-H "Authorization: Bearer ${YOUR_API_KEY}"
プロトタイプレスポンス
{
"id": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef",
"type": "creative-lab-keycap-prototype",
"name": "",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1753142456000,
"started_at": 1753142460000,
"finished_at": 1753142516000,
"expires_at": 1753401716000,
"preceding_tasks": 0,
"task_error": null,
"consumed_credits": 12,
"image_urls": [
"https://assets.meshy.ai/***/design-1.png?Expires=***"
],
"candidate_ids": [
"0198c1b2-33f5-7d21-a4b7-8e9d0c1f2a3b"
]
}
ビルドレスポンス
{
"id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
"type": "creative-lab-keycap-build",
"name": "",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1753142600000,
"started_at": 1753142610000,
"finished_at": 1753143050000,
"expires_at": 1753402250000,
"preceding_tasks": 0,
"task_error": null,
"consumed_credits": 50,
"model_urls": {
"glb": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model.glb?Expires=***",
"obj_zip": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model-obj.zip?Expires=***"
},
"process_image_urls": {
"head_design": "https://assets.meshy.ai/***/head-design.png?Expires=***",
"composite": "https://assets.meshy.ai/***/composite.png?Expires=***",
"base_canvas": "https://assets.meshy.ai/***/base-canvas.png?Expires=***"
}
}
キーキャップタスクの削除
キーキャップタスクをキャンセルします。タスクがまだPENDINGの場合、作成時に消費されたクレジットは返金されます。すでにIN_PROGRESSのタスクは返金なしでキャンセルされます(作業者がすでにリソースを消費している可能性があります)。すでに終端状態(SUCCEEDED、FAILED、CANCELED)に達しているタスクはキャンセルできません。
URLパスはタスクのステージと一致している必要があります — /prototype/:buildIdでのDELETEは404を返します。
パスパラメータ
- Name
- id
- Type
- path
- Description
キャンセルするキーキャップタスクの一意の識別子。
戻り値
成功時には空のボディで204 No Contentを返します。
失敗モード
- Name
400 - Bad Request- Description
タスクがすでに終端状態にあり、キャンセルできません。
- Name
404 - Not Found- Description
タスクが存在しない、別のユーザーに属している、またはそのステージがURLパスと一致しません。
- Name
500 - Internal Server Error- Description
キャンセル中に予期しないサーバー側のエラーが発生しました。タスクがキャンセルされたかどうかは不明です — 再試行する前に再確認してください。
Request
curl --request DELETE \
--url https://api.meshy.ai/openapi/creative-lab/keycap/v1/prototype/019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef \
-H "Authorization: Bearer ${YOUR_API_KEY}"
Response
// Returns 204 No Content on success (empty body).
キーキャップタスクをストリームする
Server-Sent Events (SSE) を介してキーキャップタスクのリアルタイム更新をストリームします。
URL パスはタスクのステージと一致する必要があります — /prototype/:buildId/stream でストリームを開くと、status_code: 404 を持つ単一の event: error ペイロードが発生し、ストリームが閉じられます。
パラメータ
- Name
- id
- Type
- path
- Description
ストリームするキーキャップタスクの一意の識別子。
戻り値
キーキャッププロトタイプ または キーキャップビルド タスクオブジェクトを Server-Sent Events としてストリームで返します。PENDING または IN_PROGRESS のタスクの場合、レスポンスストリームには必要な progress と status フィールドのみが含まれます。
リクエスト
curl -N https://api.meshy.ai/openapi/creative-lab/keycap/v1/build/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/stream \
-H "Authorization: Bearer ${YOUR_API_KEY}"
レスポンスストリーム
// 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.
// For PENDING or IN_PROGRESS tasks, the response stream will not include all fields.
event: message
data: {
"id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
"progress": 0,
"status": "PENDING"
}
event: message
data: {
"id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
"type": "creative-lab-keycap-build",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1753142600000,
"started_at": 1753142610000,
"finished_at": 1753143050000,
"expires_at": 1753402250000,
"task_error": null,
"consumed_credits": 50,
"model_urls": {
"glb": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model.glb?Expires=***",
"obj_zip": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model-obj.zip?Expires=***"
},
"process_image_urls": {
"head_design": "https://assets.meshy.ai/***/head-design.png?Expires=***"
}
}
キーキャップタスクの一覧
単一ステージのキーキャップタスクのページネーションされたリストを取得します。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 をリストする場合はキーキャッププロトタイプタスクオブジェクト、/build をリストする場合はキーキャップビルドタスクオブジェクトです。
リクエスト
# List prototype tasks
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/prototype?page_size=10 \
-H "Authorization: Bearer ${YOUR_API_KEY}"
# List build tasks
curl https://api.meshy.ai/openapi/creative-lab/keycap/v1/build?page_size=10 \
-H "Authorization: Bearer ${YOUR_API_KEY}"
レスポンス (プロトタイプタスクの一覧)
[
{
"id": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef",
"type": "creative-lab-keycap-prototype",
"name": "",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1753142456000,
"started_at": 1753142460000,
"finished_at": 1753142516000,
"expires_at": 1753401716000,
"preceding_tasks": 0,
"task_error": null,
"consumed_credits": 12,
"image_urls": [
"https://assets.meshy.ai/***/design-1.png?Expires=***"
],
"candidate_ids": [
"0198c1b2-33f5-7d21-a4b7-8e9d0c1f2a3b"
]
}
]
キーキャッププロトタイプタスクオブジェクト
キーキャッププロトタイプタスクオブジェクトは、Meshyが追跡する作業単位であり、ソース写真から1つの完成したキーキャップデザイン画像を生成します。この段階の出力は、input_task_idとcandidate_idを介してビルド段階に連鎖されます。
プロパティ
- Name
- id
- Type
- string
- Description
タスクの一意の識別子。タスクIDにはkソート可能なUUIDを使用していますが、IDの形式については何も仮定しないでください。
- Name
- type
- Type
- string
- Description
タスクの種類。値は
creative-lab-keycap-prototypeです。
- Name
- name
- Type
- string
- Description
タスクが作成されたときに提供されたタスク名。名前が提供されなかった場合は空の文字列です。
- Name
- status
- Type
- string
- Description
タスクのステータス。可能な値は
PENDING、IN_PROGRESS、SUCCEEDED、FAILED、CANCELEDのいずれかです。
- Name
- progress
- Type
- integer
- Description
タスクの進捗。タスクがまだ開始されていない場合、このプロパティは
0になります。タスクが成功した後、これが100になります。
- Name
- created_at
- Type
- timestamp
- Description
タスクが作成された時のタイムスタンプ(ミリ秒単位)。
タイムスタンプは、1970年1月1日UTCから経過したミリ秒数を表し、RFC 3339
標準に従います。例えば、2023年9月1日金曜日12:00:00 PM GMTは1693569600000として表されます。これはMeshy APIのすべてのタイムスタンプに適用されます。
- Name
- started_at
- Type
- timestamp
- Description
タスクが開始された時のタイムスタンプ(ミリ秒単位)。タスクがまだ開始されていない場合、このプロパティは
0になります。
- Name
- finished_at
- Type
- timestamp
- Description
タスクが終了した時のタイムスタンプ(ミリ秒単位)。タスクがまだ終了していない場合、このプロパティは
0になります。
- Name
- expires_at
- Type
- timestamp
- Description
タスク結果の有効期限のタイムスタンプ(ミリ秒単位)。
- Name
- preceding_tasks
- Type
- integer
- Description
先行タスクの数。
このフィールドの値は、タスクのステータスが
PENDINGの場合にのみ意味があります。
- Name
- task_error
- Type
- object
- Description
失敗したタスクのエラー詳細。完全な
task_errorオブジェクトのリファレンスについては、エラーを参照してください。
- Name
- consumed_credits
- Type
- integer
- Description
このタスクによって消費されたクレジットの数。
SUCCEEDEDに達したタスクは、その段階の全額が請求されます。作成されなかったタスク(リクエスト時の4xx、モデレーション拒否を含む)は全く請求されません。FAILEDに達したタスクは0を返し、請求は返金されます(非同期のモデレーションブロックを含む)。DELETEによるキャンセルは、タスクがまだPENDINGの間のみ返金されます。すでにIN_PROGRESSのタスクは請求されたままです。なぜなら、作業がすでに行われているからです。
- Name
- image_urls
- Type
- array of strings
- Description
完成したキーキャップデザインレンダーのダウンロード可能なURL — 候補が完成したキーキャップとしてどのように見えるかを示します。単一のエントリを保持します。
image_urls[i]はcandidate_ids[i]に対応します。タスクがSUCCEEDEDに達するまで空です。このURLは表示専用であり、ビルドエンドポイントはこれらのURLではなくcandidate_idsを消費します。model_urlsと同じURLライフサイクル:署名済み、Authorizationヘッダーなし、expires_atまで有効、タスクが再読み込みされても安定しています。
- Name
- candidate_ids
- Type
- array of strings
- Description
image_urlsに並行する不透明な候補識別子。選択したデザインに一致するエントリをビルドリクエストのcandidate_idとして渡します。これらのIDの形式については何も仮定しないでください。
Example Keycap Prototype Task Object
{
"id": "019c9a4e-2b31-7f6a-8c44-5d2a87b3c1ef",
"type": "creative-lab-keycap-prototype",
"name": "",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1753142456000,
"started_at": 1753142460000,
"finished_at": 1753142516000,
"expires_at": 1753401716000,
"preceding_tasks": 0,
"task_error": null,
"consumed_credits": 12,
"image_urls": [
"https://assets.meshy.ai/***/design-1.png?Expires=***"
],
"candidate_ids": [
"0198c1b2-33f5-7d21-a4b7-8e9d0c1f2a3b"
]
}
キーキャップビルドタスクオブジェクト
キーキャップビルドタスクオブジェクトは、Meshyが追跡している作業単位で、成功したプロトタイプタスクと選択された候補から最終的なテクスチャ付き3Dキーキャップを生成します。単一のビルドは、ホワイトモデル生成、自動シーティングとカッティング、着色、組み立て、エクスポートの全パイプラインを実行します。
プロパティ
- Name
- id
- Type
- string
- Description
タスクの一意の識別子。
- Name
- type
- Type
- string
- Description
タスクのタイプ。値は
creative-lab-keycap-buildです。
- Name
- name
- Type
- string
- Description
タスクが作成されたときに提供されたタスク名。名前が提供されなかった場合は空文字列。
- Name
- status
- Type
- string
- Description
タスクのステータス。可能な値は
PENDING、IN_PROGRESS、SUCCEEDED、FAILED、CANCELEDのいずれかです。
- Name
- progress
- Type
- integer
- Description
タスクの進捗状況。タスクがまだ開始されていない場合、このプロパティは
0です。タスクが成功した場合、これは100になります。
- Name
- created_at
- Type
- timestamp
- Description
タスクが作成された時のタイムスタンプ(ミリ秒単位)。
- Name
- started_at
- Type
- timestamp
- Description
タスクが開始された時のタイムスタンプ(ミリ秒単位)。
- Name
- finished_at
- Type
- timestamp
- Description
タスクが終了した時のタイムスタンプ(ミリ秒単位)。
- Name
- expires_at
- Type
- timestamp
- Description
タスク結果の有効期限が切れる時のタイムスタンプ(ミリ秒単位)。
- Name
- preceding_tasks
- Type
- integer
- Description
先行タスクの数。ステータスが
PENDINGの場合にのみ意味があります。
- Name
- task_error
- Type
- object
- Description
失敗したタスクのエラー詳細。完全な
task_errorオブジェクトのリファレンスについてはエラーを参照してください。
- Name
- consumed_credits
- Type
- integer
- Description
このタスクによって消費されたクレジットの数。
SUCCEEDEDに達したタスクは、そのステージの全額が課金されます。作成されなかったタスク(リクエスト時の4xx、モデレーション拒否を含む)は一切課金されません。FAILEDに達したタスクは0を返し、課金は返金され、非同期モデレーションブロックも含まれます。DELETEによるキャンセルは、タスクがまだPENDINGの間のみ返金されます。すでにIN_PROGRESSのタスクは課金されたままです。なぜなら、作業がすでに行われているからです。
- Name
- model_urls
- Type
- object
- Description
生成されたモデルアーティファクトのダウンロード可能なURL。GLBとOBJバンドルの両方が実世界のミリメートルスケール、Y-up、キーキャップの前面が**+Z**を向いてエクスポートされます。メッシュは
keycap-headとkeycap-baseと名付けられています。ベースがパターンフィルにフォールバックする場合、ステムキャビティ用の3番目のメッシュkeycap-base-interiorも存在します。正確に2つのメッシュがあるとは限りません。これらは署名付きURLです:
Authorizationヘッダーなしで取得してください。これらはexpires_atまで有効で、finished_atの3日後です。その間にタスクを再読み込みすると、新しい署名付きURLではなく同一のURLが返されます。それまでにファイルをダウンロードして保存してください — 期限切れのリンクを更新する方法はありません。- Name
glb- Type
- string
- Description
最終的なテクスチャ付き
model.glbのダウンロード可能なURL。
- Name
obj_zip- Type
- string
- Description
model.obj、model.mtl、およびそのMTLが実際に参照するテクスチャPNGsを含むzipバンドルのダウンロード可能なURL。単色ベースにはkeycap-head.pngのみが含まれます。パターンベースにはkeycap-base.pngも含まれます。
- Name
- process_image_urls
- Type
- object
- Description
種類ごとにキー付けされた中間プロセス画像のダウンロード可能なURL。
model_urlsと同じURLライフサイクル:署名付き、Authorizationヘッダーなし、expires_atまで有効、タスクが再読み込みされたときに安定。現在発行されている種類:head_design— ビルドが消費した選択された候補のデザイン画像(常に存在)。composite— 選択された候補の完成キーキャップ表示レンダー(利用可能な場合に存在)。base_canvas— 塗装されたキーキャップベースキャンバス(利用可能な場合に存在)。
キーセットはオープンエンドとして扱ってください。新しい種類が破壊的変更なしに追加される可能性があります。
Example Keycap Build Task Object
{
"id": "019c9a52-7d18-7e2b-9f01-6e3b98c4d2af",
"type": "creative-lab-keycap-build",
"name": "",
"status": "SUCCEEDED",
"progress": 100,
"created_at": 1753142600000,
"started_at": 1753142610000,
"finished_at": 1753143050000,
"expires_at": 1753402250000,
"preceding_tasks": 0,
"task_error": null,
"consumed_credits": 50,
"model_urls": {
"glb": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model.glb?Expires=***",
"obj_zip": "https://assets.meshy.ai/***/tasks/019c9a52-7d18-7e2b-9f01-6e3b98c4d2af/output/model-obj.zip?Expires=***"
},
"process_image_urls": {
"head_design": "https://assets.meshy.ai/***/head-design.png?Expires=***",
"composite": "https://assets.meshy.ai/***/composite.png?Expires=***",
"base_canvas": "https://assets.meshy.ai/***/base-canvas.png?Expires=***"
}
}
エンドツーエンドの例
完全なフロー: 写真からプロトタイプを作成し、それをSUCCEEDEDまでポーリングし、candidate_idsから候補を選び、その候補でビルドを作成し、ビルドをSUCCEEDEDまでポーリングし、最後にmodel_urlsからGLBとOBJバンドルをダウンロードします。
この例では、プログラム的に最初の候補を選びます。実際の統合では、image_urlsエントリをエンドユーザーに表示し、選択させます。選択されたインデックスはcandidate_idsに1:1でマッピングされます。
完全なフロー
#!/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://...
: "${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
BASE="https://api.meshy.ai/openapi/creative-lab/keycap/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 '{"image_url":"data:%s;base64,' "$MIME"
base64 <"$IMAGE_PATH" | tr -d '\n'
printf '"}'
} >"$BODY"
else
printf '{"image_url":"%s"}' "$IMAGE_URL" >"$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 design render
poll prototype "$PROTO_ID"
# 3. Pick a candidate (first one here; show image_urls to a user in production)
CANDIDATE_ID=$(api GET "$BASE/prototype/$PROTO_ID" | jq -r '.candidate_ids[0]')
# 4. Create the build task
jq -n --arg p "$PROTO_ID" --arg c "$CANDIDATE_ID" \
'{input_task_id: $p, candidate_id: $c}' >"$BODY"
BUILD_ID=$(api POST "$BASE/build" \
-H 'Content-Type: application/json' --data-binary @"$BODY" | jq -r '.result')
# 5. Wait for the model (a build usually takes 3-7 minutes)
poll build "$BUILD_ID"
# 6. Download the artifacts. These are signed URLs: no Authorization header,
# and they stay valid for 3 days after the task finishes.
TASK=$(api GET "$BASE/build/$BUILD_ID")
curl --silent --show-error --fail --max-time 900 \
-o keycap.glb "$(jq -r '.model_urls.glb' <<<"$TASK")"
curl --silent --show-error --fail --max-time 900 \
-o keycap-obj.zip "$(jq -r '.model_urls.obj_zip' <<<"$TASK")"
echo "Done: keycap.glb + keycap-obj.zip"