Bytedance Seed3d 2.0 Image To 3d API Documentation

Bytedance Seed3d 2.0 Image To 3d API Documentation

Playground

Try it on WaveSpeedAI!

ByteDance Seed3D 2.0 is a fast AI image-to-3D generation model that converts a single reference image into a GLB 3D asset. Ready-to-use REST inference API for 3D asset generation, product visualization, game assets, AR/VR content, digital twins, creative design, and professional image-to-3D workflows with simple integration, no coldstarts, and affordable pricing.

Features

ByteDance Seed3D 2.0 Image-to-3D converts a single reference image into a downloadable GLB 3D asset. Upload an image of the object, choose a mesh subdivision level, and receive a WaveSpeed CDN output URL.


Why Choose This?

  • Single-image 3D generation Convert one reference image into a downloadable GLB 3D asset.

  • Subdivision level control Choose low, medium, or high subdivision level depending on the desired mesh detail.

  • GLB output The model returns a GLB file suitable for common 3D workflows.


Parameters

ParameterRequiredDescription
imageYesReference image URL for the object to reconstruct.
subdivision_levelNoMesh subdivision level: low, medium, or high. Default: medium.

How to Use

  1. Upload your image — Provide a reference image URL for the object you want to reconstruct.
  2. Choose subdivision level (optional) — Select low, medium, or high. The default is medium.
  3. Submit — Generate the GLB 3D asset.
  4. Download the result — The generated GLB URL is returned in the standard WaveSpeed prediction response outputs array.

Pricing

Pricing is fixed at $0.40 per generation.

OutputCost
1 generation$0.40

Billing Rules

  • Each request generates one GLB 3D asset.
  • Each generation costs $0.40.
  • The price is fixed and does not change based on subdivision_level.

Best Use Cases

  • Image-to-3D asset creation — Generate a 3D asset from a single object image.
  • Product 3D previews — Convert product images into GLB assets for 3D display workflows.
  • Prototype asset generation — Quickly create draft 3D assets from reference images.
  • Object reconstruction — Reconstruct one main object from a clean, centered input image.
  • GLB-based workflows — Generate assets in GLB format for downstream 3D use.

Pro Tips

  • Use clean, centered images with one main object.
  • Avoid cluttered backgrounds when possible.
  • Make sure the object is clearly visible in the input image.
  • Use the default medium subdivision level unless you specifically need lower or higher mesh subdivision.
  • Ensure the image URL is publicly accessible.

Notes

  • image is the only required field.
  • subdivision_level is optional.
  • Default subdivision_level is medium.
  • Output is returned as a GLB file.
  • Ensure uploaded image URLs are publicly accessible.

Authentication

For authentication details, please refer to the Authentication Guide.

API Endpoints

Submit Task & Query Result

set -euo pipefail

export WAVESPEED_API_KEY="your-api-key"

REQUEST_BODY=$(cat <<'JSON'
{
  "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
  "subdivision_level": "medium"
}
JSON
)

# 1. Submit the prediction once. Never retry this request automatically:
# a retry after an unclear failure can create a second, billed task.
CHECK='The task may already exist. Check History or the predictions list before submitting again.'
if ! SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  --connect-timeout 10 --max-time 60 \
  -X POST "https://api.wavespeed.ai/api/v3/bytedance/seed3d-2.0/image-to-3d" \
  -H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
  -H "Content-Type: application/json" \
  -d "${REQUEST_BODY}"); then
  printf 'Submit failed. %s\n' "${CHECK}" >&2
  exit 1
fi

TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; then
  printf 'Submission response did not contain a prediction id. %s\n' "${CHECK}" >&2
  exit 1
fi
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"

# 2. Poll until the prediction reaches a final status.
BODY_FILE=$(mktemp)
trap 'rm -f "${BODY_FILE}"' EXIT
while true; do
  # Transient errors (429, 5xx) are retried, honoring Retry-After.
  HTTP_CODE=$(curl --silent --show-error --fail-with-body \
    --connect-timeout 10 --max-time 60 --retry 5 --retry-delay 2 \
    --output "${BODY_FILE}" --write-out '%{http_code}' \
    "${RESULT_URL}" \
    -H "Authorization: Bearer ${WAVESPEED_API_KEY}" || true)
  case "${HTTP_CODE}" in
    2??) ;;
    000|429|5??)  # dropped connection or temporary error: keep polling
      printf 'Task %s: HTTP %s, polling again in 10s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
      sleep 10; continue ;;
    *) printf 'Task %s: HTTP %s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
      cat "${BODY_FILE}" >&2; exit 1 ;;
  esac
  RESULT=$(jq 'if type == "object" and has("data") then .data else . end' "${BODY_FILE}")
  STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')

  case "${STATUS}" in
    completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
    failed|cancelled|timeout|deleted)
      printf 'Task %s ended with status %s\n' "${PREDICTION_ID}" "${STATUS}" >&2
      printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
    *) sleep 2 ;;
  esac
done

Retry temporary errors only while polling, never the submit request. Errors, retries and timeouts

Parameters

Task Submission Parameters

Request Parameters

ParameterTypeRequiredDefaultRangeDescription
imagestringYes-Reference image URL for Seed3D generation.
subdivision_levelstringNomediumlow, medium, highMesh subdivision level.

Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
data.idstringUnique identifier for the prediction, Task Id
data.modelstringModel ID used for the prediction
data.outputsarrayOutput values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed)
data.urlsobjectObject containing related API endpoints
data.statusstringTask status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses.
data.created_atstringISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”)
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds

Result Request Parameters

ParameterTypeRequiredDefaultDescription
idstringYes-Task ID

Result Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
dataobjectThe prediction data object containing all details
data.idstringUnique identifier for the prediction
data.modelstringModel ID used for the prediction
data.outputsarray<string | object>Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model.
data.urlsobjectObject containing related API endpoints
data.statusstringStatus: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses
data.created_atstringISO timestamp of when the request was created
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds
© 2026 WaveSpeedAI. All rights reserved.