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.
# 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.
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.
| Format | Imported with | Companion files |
|---|---|---|
| .glb | Blender's glTF importer | everything is inside the file |
| .gltf | glTF importer | .bin buffers and textures are fetched from the same folder as the .gltf |
| .obj | OBJ importer | .mtl and the textures it names, from the same folder |
| .fbx, .usd / .usdc / .usdz, .stl, .ply, .abc | Blender's importers | embed 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.
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).
| from | how |
|---|---|
| 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 |
| ChatGPT | Settings → Connectors → Advanced → Developer mode → Create → https://render.janction.jp/mcp (OAuth) |
| Claude Code | claude mcp add --transport http janction-render https://render.janction.jp/mcp, then /mcp to authenticate |
| Codex | codex mcp add janction-render --url https://render.janction.jp/mcp |
| Cursor / VS Code | Add 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 CLI | gemini extensions install https://github.com/JasmyLab-JANCTION/janction-render |
| Grok / Perplexity / Le Chat | Add 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 clients | Streamable 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 |
No. The service runs Blender 5.0 on its GPU worker; you send a file link and get links back.
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'.
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).
Yes. notify_url in the job body receives a JSON POST (job.done or job.failed, with artifact links) when the job finishes.
JANCTION Render v0.4.20 · JasmyLab Inc. · Updated 2026-10-07 · Tested with Blender 5.0, JANCTION Render 0.4.20 · 日本語