curlで画像をGLBに変換
小さなBashワークフローで画像を送信し、同じタスクが完了するまで確認してGLBをダウンロードできます。専用のTO3D CLIは不要で、生成とリギングは別タスクです。
2026年9月27日確認済み
開始前に
ダッシュボードでAPIキーを作成し、環境変数に保管します。画像URLはサービスから到達できる必要があります。image-to-3dはURLまたはbase64のPNG、JPEG、GIFを受け付け、上限は128 MBです。
- すべてのリクエストで x-api-key ヘッダーを使用します。
- 生成タスクは 202 を返し、pending から processing を経て succeeded、failed、または canceled に進みます。
- プロバイダーがタスクを完了できなかった場合、failed または canceled のタスクは自動的に返金されます。
export TO3D_KEY='your_api_key'
export TO3D_IMAGE_URL='https://example.com/photo.png'
BASE='https://api.to3d.app'画像を1枚送信
画像URLをTrellisへPOSTします。返されたidを先に保存してください。確認とダウンロードはそのidを使い、別の有料タスクを作りません。
- task_type image-to-3d を送信します。
- 画像 URL を input.image に入れます。
- レスポンスの id は不透明な値として扱い、返されたまま正確に保持します。
TASK_JSON=$(curl -sS --fail-with-body "$BASE/api/trellis/tasks" \
-H "x-api-key: $TO3D_KEY" -H 'Content-Type: application/json' \
-d "$(jq -cn --arg image "$TO3D_IMAGE_URL" '{task_type: "image-to-3d", input: {image: $image}}')")
TASK_ID=$(jq -er '.id' <<<"$TASK_JSON")
printf 'Task: %s\n' "$TASK_ID"確認してGLBを取得
同じタスクidでエンドポイントを確認します。成功時のoutput.model_fileはAPIキーなしで取得できる永続URLです。
- 確認の間隔を 5 秒にし、用途に合った上限でループを制限します。
- ループがタイムアウトしても再送信せず、後で元のタスク id を確認します。
- ビューアーやエンジンに渡す前に、ファイルの先頭 4 バイトが glTF か確認します。
MODEL_URL=''
for ((attempt = 0; attempt < 120; attempt++)); do
STATUS_JSON=$(curl -sS --fail-with-body "$BASE/api/trellis/tasks/$TASK_ID" -H "x-api-key: $TO3D_KEY")
STATUS=$(jq -er '.status' <<<"$STATUS_JSON")
case "$STATUS" in
succeeded) MODEL_URL=$(jq -er '.output.model_file' <<<"$STATUS_JSON"); break ;;
failed|canceled) jq '{id,status,error}' <<<"$STATUS_JSON" >&2; exit 1 ;;
pending|processing) sleep 5 ;;
esac
done
[ -n "$MODEL_URL" ] || { echo "Timed out; keep the task id" >&2; exit 1; }
curl -fsSL "$MODEL_URL" -o model.glb
[ "$(head -c 4 model.glb)" = glTF ]結果を任意でリギング
リギングはダウンロードしたGLBに対する2回目のリクエストです。humanoid骨格が必要な場合だけSkin Tokensタスクを作成し、同じパターンで確認します。
- /api/skin_tokens/tasks に task_type rig を送信します。
- input.model に GLB URL または base64 の GLB を設定し、original、mixamo、ue5 のいずれかのボーン名を選びます。
- リグ用エンドポイントは自身のタスク完了後に output.model_file を返します。
curl -sS --fail-with-body "$BASE/api/skin_tokens/tasks" \
-H "x-api-key: $TO3D_KEY" -H 'Content-Type: application/json' \
-d '{"task_type":"rig","input":{"model":"https://storage.to3d.app/tasks/example/model.glb","bone_names":"mixamo"}}'失敗とタイムアウト
一時的な503やローカルの確認タイムアウトで2つ目のタスクを作らないでください。まず元のidを確認し、状態とエラーの記録を読みます。
- 一時的な HTTP エラーはバックオフ付きで再試行し、同じタスク id を使い続けます。
- 400 はリクエスト形式または入力が無効、401 はキーがないか無効であることを示します。
- タスクの 404 レスポンスは、そのタスクを作成したアカウントに限定されます。
curl -sS "$BASE/api/trellis/tasks/$TASK_ID" -H "x-api-key: $TO3D_KEY" | jq '{id,status,output,error}'