Hyper3DHyper3D Docs
API Specification

Bang

Submit a Bang task from a Rodin asset or an uploaded model.

POST
/api/v2/bang
AuthorizationBearer <token>

In: header

Request Body

multipart/form-data

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

curl -X POST "https://example.com/api/v2/bang"
{  "error": "NO_SUCH_TASK",  "message": "Submitted.",  "uuid": "123e4567-e89b-12d3-a456-426614174000",  "submit_time": "2019-08-24T14:15:22Z",  "jobs": {    "uuids": [      "52faea01-729e-4195-85e8-6050a65315e3"    ],    "subscription_key": "string"  },  "consumed": 0.5}

Bang accepts exactly one of two input modes. Sending both asset_id and model, or neither, is rejected.

Rodin asset input

Use the top-level uuid returned by a completed Rodin generation as asset_id.

  • Required: asset_id.
  • Optional: geometry_file_format, strength, material, resolution, seed, escore, and reference_scale.
  • Mutually exclusive: model, image and prompt must be omitted.

When material generation is enabled, escore and reference_scale apply in both input modes. Values sent with an asset_id override the corresponding settings stored on that asset; when omitted, the endpoint uses its request defaults.

curl --fail-with-body --request POST 'https://api.hyper3d.com/api/v2/bang' \
  --header "Authorization: Bearer ${RODIN_API_KEY}" \
  --form 'asset_id=123e4567-e89b-12d3-a456-426614174000' \
  --form 'strength=5' \
  --form 'geometry_file_format=glb'
import os

import requests

response = requests.post(
    "https://api.hyper3d.com/api/v2/bang",
    headers={"Authorization": f"Bearer {os.environ['RODIN_API_KEY']}"},
    data={
        "asset_id": "123e4567-e89b-12d3-a456-426614174000",
        "strength": 5,
        "geometry_file_format": "glb",
    },
    timeout=60,
)
response.raise_for_status()
print(response.json())

Custom model input

Upload one model. A reference image is required unless material is None, because material generation needs something to sample from; omitting it is rejected with INVALID_REQUEST and a descriptive message.

  • Required: model, and image unless material=None.
  • Optional: geometry_file_format, prompt, strength, material, resolution, reference_scale, escore, seed.
  • Mutually exclusive: asset_id must be omitted.
  • Supported model formats: obj, glb, stl, fbx, usd, usda, usdz, and usdc.
  • strength accepts 1 to 12 and defaults to 5. Higher values split the model into more pieces.
curl --fail-with-body --request POST 'https://api.hyper3d.com/api/v2/bang' \
  --header "Authorization: Bearer ${RODIN_API_KEY}" \
  --form 'model=@./model.glb' \
  --form 'image=@./reference.png' \
  --form 'prompt=Separate the main structural parts' \
  --form 'strength=5' \
  --form 'geometry_file_format=glb'
import os
from pathlib import Path

import requests

with Path("model.glb").open("rb") as model_file, Path("reference.png").open("rb") as image_file:
    response = requests.post(
        "https://api.hyper3d.com/api/v2/bang",
        headers={"Authorization": f"Bearer {os.environ['RODIN_API_KEY']}"},
        files={
            "model": ("model.glb", model_file, "model/gltf-binary"),
            "image": ("reference.png", image_file, "image/png"),
        },
        data={
            "prompt": "Separate the main structural parts",
            "strength": 5,
            "geometry_file_format": "glb",
        },
        timeout=60,
    )
response.raise_for_status()
print(response.json())

Pricing

Every Bang request costs 0.5 credits, regardless of whether it uses a Rodin asset or an uploaded custom model and regardless of the selected input options.

Response and errors

{
  "message": "Submitted.",
  "uuid": "123e4567-e89b-12d3-a456-426614174000",
  "jobs": {
    "uuids": ["223e4567-e89b-12d3-a456-426614174000"],
    "subscription_key": "subscription-key-from-generation-response"
  },
  "consumed": 0.5
}

Bang uses the same application error codes as the other generation endpoints. HTTP 201 means the endpoint handled the request, but the task is accepted only when error is absent or empty and the top-level uuid is non-empty. HTTP 400 covers invalid fields, unsupported files, or conflicting input modes; 401 indicates invalid authentication; 429 indicates throttling. Poll and download using the same identifier rules as other generation endpoints.