3D file to MP4 over an API (and over MCP)

Updated 2026-10-07

JANCTION Render renders a 3D file into a video over HTTP in four calls: POST /v1/keys for a key (no sign-up), POST /v1/files/url with the file's https link (returns scene_id), POST /v1/jobs with kind 'final', output 'mp4' and either orbit true (a turntable) or a frame range (the file's own animation), then GET /v1/jobs/{id} until status is done and fetch output.mp4 from the artifact link. From an AI agent it is one tool call, render_final(scene_url=..., orbit=True, output='mp4'). Blender 5.0 with Cycles on a datacenter GPU does the import and the render; textures next to a glTF or OBJ are fetched automatically. Free beta: 10 GPU-minutes per key per day, up to 240 frames at 1080p per job.

HTTP: the four calls

# 1. a key (no sign-up; keep it)
KEY=$(curl -s -X POST https://render.janction.jp/v1/keys | python -c "import sys,json;print(json.load(sys.stdin)['api_key'])")

# 2. the file, by https link (.glb .gltf .fbx .usd .usdc .usdz .obj .stl .ply .abc or .blend / .py)
curl -s -X POST https://render.janction.jp/v1/files/url -H "X-API-Key: $KEY" -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/model.glb"}'
# -> {"scene_id": "f_...", ...}

# 3a. a turntable video (one rotation, 48 frames, studio lighting)
curl -s -X POST https://render.janction.jp/v1/jobs -H "X-API-Key: $KEY" -H "Content-Type: application/json" \
  -d '{"scene_id": "f_...", "kind": "final", "orbit": true, "orbit_frames": 48, "width": 1280, "height": 720,
       "samples": 64, "environment": "studio", "output": "mp4", "fps": 24}'
# 3b. or the file's own animation (frames 1-120 of a glTF with animation clips)
#  -d '{"scene_id": "f_...", "kind": "final", "frame_start": 1, "frame_end": 120, "width": 1280, "height": 720,
#       "samples": 64, "environment": "studio", "output": "mp4", "fps": 24}'
# -> {"job_id": "j_...", "status": "queued", "estimate": {"seconds": ..., "human": "..."}, ...}

# 4. wait, then download
curl -s https://render.janction.jp/v1/jobs/j_... -H "X-API-Key: $KEY"        # status, progress, eta, artifacts[]
curl -s -o output.mp4 "https://render.janction.jp/v1/jobs/j_.../artifacts/output.mp4" -H "X-API-Key: $KEY"

Before step 3, POST /v1/estimate with the same body returns the GPU seconds and whether it fits today's quota. notify_url in the job body receives one JSON POST when the job finishes, so a pipeline does not have to poll. Every field is in the OpenAPI; a preview ("kind": "preview", 1 to 4 frames tiled in one image) costs a few GPU seconds and is the right first call.

MCP: one call

render_preview(scene_url="https://example.com/model.glb", orbit=True, environment="studio")   # four angles, seconds
render_final(scene_url="https://example.com/model.glb", orbit=True, orbit_frames=48, width=1280, height=720,
             environment="studio", output="mp4")                                                 # the video

The MCP URL is https://render.janction.jp/mcp; Claude.ai, ChatGPT, Claude Code, Codex and Cursor connect with OAuth and get a free key on the consent page.

What the service does with the file

FormatImported withCompanion files
.glbBlender's glTF importereverything is inside the file
.gltfglTF importer.bin buffers and textures are fetched from the same folder as the .gltf
.objOBJ importer.mtl and the textures it names, from the same folder
.fbx, .usd / .usdc / .usdz, .stl, .ply, .abcBlender's importersembed textures, or pass them in asset_urls (they land next to the file)

The model is centred; with orbit the camera circles it at the elevation and distance you set (flat floors and walls are ignored when framing). Without orbit, a file with its own camera uses it; otherwise a default camera frames the bounds. Outputs: mp4 (H.264), webm (VP9, alpha with transparent), prores (.mov, for editing), gif / webp (up to 960 px), or png / exr frames.

Limits during the beta

240 frames and 1080p per job (split longer clips into several jobs or use notify_url to chain them), 10 GPU-minutes per key per day, inputs and results deleted 24 hours after last use. Measured: a 24-frame 720p turntable of a headphones model, 58 GPU-seconds; 48-frame EEVEE clips at 720p, 46 to 57 GPU-seconds (examples, costs).

fromhow
A file on this computer (.blend, 3D file)Drop it at /upload to get a 12-hour link (no sign-up), then tell the AI "Render this file: <link>". From inside Blender use the add-on; from a terminal the CLI uploads directly
Claude.ai (web / desktop / mobile)Settings → Connectors → Add custom connector → https://render.janction.jp/mcp. "Connect" opens a page that creates a free key
ChatGPTSettings → Connectors → Advanced → Developer mode → Create → https://render.janction.jp/mcp (OAuth)
Claude Codeclaude mcp add --transport http janction-render https://render.janction.jp/mcp, then /mcp to authenticate
Codexcodex mcp add janction-render --url https://render.janction.jp/mcp
Cursor / VS CodeAdd to Cursor Add to VS Code
The button opens the editor; confirm and it is added. Manual: Streamable HTTP at https://render.janction.jp/mcp
Gemini CLI / Antigravity CLIgemini extensions install https://github.com/JasmyLab-JANCTION/janction-render
Grok / Perplexity / Le ChatAdd a custom (remote MCP) connector with https://render.janction.jp/mcp in each app's Connectors settings (Grok: New Connector → Custom; Perplexity: Pro / Max / Enterprise; Le Chat: workspace admin)
Windsurf, Cline, Goose, other MCP clientsStreamable HTTP at https://render.janction.jp/mcp; OAuth or Authorization: Bearer <api key>
Terminal (stdio, sends local files)claude mcp add janction-render -e JANCTION_RENDER_SERVER=https://render.janction.jp -- uvx --from janction-render janction-render-mcp
Inside Blender (for people)The add-on; extension repository https://render.janction.jp/extensions/index.json. Maya / Houdini / Cinema 4D: submit tools

FAQ

Do I need Blender installed?

No. The service runs Blender 5.0 on its GPU worker; you send a file link and get links back.

Can the file have its own animation?

Yes. glTF, FBX, USD and Alembic animation is imported; give frame_start / frame_end instead of orbit. The frame range of the file is reported by scene_info (MCP) or a job with kind 'info'.

How big can the file be?

Tens of megabytes are fine; the receptionist fetches it once and keeps it 24 hours after last use. Large texture sets: pass them in asset_urls or embed them (GLB, USDZ).

Is there a webhook?

Yes. notify_url in the job body receives a JSON POST (job.done or job.failed, with artifact links) when the job finishes.

Related

Overview · llms.txt

JANCTION Render v0.4.20 · JasmyLab Inc. · Updated 2026-10-07 · Tested with Blender 5.0, JANCTION Render 0.4.20 · 日本語