Render final frames or video
render_finalRender the final frames or video of a Blender scene on cloud GPUs, after the user approved a preview: 'render the final', 'make the video', 'export the turntable MP4'. Call render_estimate first when the time or the free GPU time left (the welcome credit, or 2 preview GPU-minutes a day after it) is uncertain, the job is longer than about 24 frames or above 720p, or the user asks how long it takes, and tell the user. For animations, keep the approved engine/look, test 10 contiguous final-path frames, then estimate again. Long jobs are rendered in chunks and joined into one video. Returns job_id and estimate.human at once (short jobs return the links directly); then call render_download(job_id, wait_seconds=45). Use the preview's environment and blender. Render only what the user approved at the shown price (max_yen caps it). Limits: up to 3,000 frames per call (over 240 runs as parts under one job id); 1920x1080 on free time, 3840x2160 with prepaid credit; each new key gets 100 JPY of GPU time free with no card (14 days) and 400 JPY more once the user saves a card on a page that charges nothing (once per card); after that, previews are free up to 2 GPU-minutes a day and finals cost 0.1 JPY per GPU-second (prepaid); ask before a render the free time does not cover; files are deleted 24 h after last use (7 days once topped up). preset='product' | 'turntable' | 'animation' fills the settings for that purpose. Options per parameter: output (png, exr, mp4, webm, prores, gif, webp), orbit, cameras, transparent, engine, notify_url, asset_urls ('polyhaven:'). Pass scene_id from render_preview, or scene_script / scene_url for a new scene. colors={'Body': '#cc2233'}: object name -> colour for its material's Principled Base Color (copied for this render; the scene file is unchanged). A variations preview gives each variant's render_final args. compare_to=<job_id of an earlier final of this key>: when this render finishes, also returns compare.mp4 (before / after side by side), compare.gif and compare.json (most changed frames). passes=['depth','mist','normal','diffuse','glossy','emission','ao','shadow_catcher','crypto_object','crypto_material'] (Cycles): each frame becomes one multilayer OpenEXR with those passes (output 'exr'); output='prores4444' gives a ProRes 4444 .mov (alpha with transparent=True). deliver=['x','vertical','square'] (animations): also returns social_x.mp4 (fits X: up to 2:20, 512 MB, 1080p or 720p), social_vertical.mp4 (1080x1920) and social_square.mp4 (1080x1080); the whole frame on a blurred fill, no cropping.
Tool call template
This tool declares no required parameters. Add optional parameters from the input schema as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {},
"name": "render_final"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | Frames per second of the video output (default 24). | |
| test | No | Animations: 'contiguous' renders only test_frames frames from frame_start (default 10) and 'spread' only the first, middle and last frame, with exactly the settings of this final, billed like any final. The reply's final_test then gives the GPU seconds per frame, a check of the frames (black, broken, repeated), a contact sheet and the full range estimated again from this measurement, plus render_final_args to render the full range after the user agrees (the test frames are reused). Leave empty to render the whole range. | |
| orbit | No | True: turntable; an orbit camera circles the scene once (the scene's own camera is not used). Flat floors and walls are ignored when framing. A preview without frames shows 0/90/180/270 degrees; a final without frame_end renders the whole turn as an MP4. Best for imported models and product videos. | |
| width | No | Output width in pixels (previews are capped at 1280x720 keeping the aspect ratio; a final frame can have at most 1920x1080 pixels on free time, 3840x2160 on prepaid credit). | |
| camera | No | Name of the camera object to render from (default: the scene's active camera, or an automatic camera if there is none). Ignored with orbit=True; not combinable with cameras. | |
| colors | No | Object name -> colour ('#cc2233' or [r, g, b, a] 0-1) for its material's Principled Base Color, e.g. a variant's render_final args. | |
| engine | No | '' or 'cycles' (path tracing, default) | 'eevee' (real-time rasterizer: about two-thirds of the Cycles per-frame cost on longer animations; every GPU chunk pays about 7-9 s of loading and shader compilation, so below about 100 frames Cycles is usually as cheap or cheaper, and previews stay on Cycles). | |
| height | No | Output height in pixels (previews are capped at 1280x720 keeping the aspect ratio; a final frame can have at most 1920x1080 pixels on free time, 3840x2160 on prepaid credit). | |
| output | No | 'auto' (mp4 for a frame range, png for one frame) | 'png' | 'exr' (16-bit linear frames for compositing) | 'mp4' (H.264) | 'webm' (VP9) | 'prores' (Apple ProRes 422 HQ .mov, for editing) | 'gif' | 'webp' (animated, at most 960 px wide; good for chat and web). | auto |
| passes | No | Render passes for compositing (Cycles, final only): 'depth', 'mist', 'normal', 'diffuse', 'glossy', 'emission', 'ao', 'shadow_catcher', 'crypto_object', 'crypto_material'. Each frame becomes one multilayer OpenEXR (beauty denoised as usual plus those passes); output must be 'exr' or 'auto'. | |
| preset | No | Purpose preset: 'product' (4 studio shots at 0/90/180/270 deg on a plain backdrop; the final gives 4 PNGs at 1440x1440), 'turntable' (one full turn as an MP4, studio light, plain backdrop), 'animation' (the scene's own camera, lights and frame range; the scene is read first when the range is unknown), or '' (none). It fills what you do not pass; environment, orbit_frames, width/height and the frames still win when given. | |
| blender | No | Blender version: '' (default: a .blend opens with the version it was saved in, other scenes with 5.0) or '5.0' / '5.2' / '5.3' (also '4.5', '4.2', '3.6'; a script that stops on Blender 5 because of an older API is rendered again on those automatically) to choose. | |
| cameras | No | Several camera object names (up to 8) rendered from the same frame in one job: the preview tiles them in one labeled sheet, the final returns one PNG/EXR per camera (camera_files maps names to files). For product shots from fixed angles. Not combinable with orbit, environment='compare' or camera. | |
| deliver | No | Extra MP4s for posting an animation, made from the rendered frames at no extra GPU time: 'x' (H.264 with a silent AAC track that fits X: up to 2 min 20 s and 512 MB, 1920x1080 or 1280x720), 'vertical' (1080x1920) and 'square' (1080x1080), the whole frame on a blurred fill with nothing cropped. | |
| max_yen | No | Ceiling for this job in JPY (-1 = none): the job is refused before anything is reserved when its reservation would exceed it. 0 means 'only if it fits the free time'. | |
| samples | No | Cycles samples per pixel (preview: up to 32, default 16; final: default 128). | |
| scene_id | No | scene_id returned by an earlier call (reuses the uploaded scene without sending it again). | |
| settings | No | 'scene' (final, .blend): render with the .blend's own resolution (with its percentage), samples, fps, engine and frame range; width, height, samples, fps and frame_start/frame_end left at their defaults (1920, 1080, 128, 24, 1/1) are taken from the scene, other values you pass win. The reply lists what the service still changes (scene_settings.overrides). Leave empty for the service defaults. | |
| exr_codec | No | EXR compression: 'ZIP' (default, lossless), 'PIZ' (lossless, good for grainy renders) or 'DWAA' (lossy, smaller; beauty only, not with passes). | |
| exr_depth | No | 'half' (16-bit, default) or 'float' (32-bit) for EXR frames (output='exr' or passes). Cryptomatte passes are always float. | |
| frame_end | No | Last frame to render (inclusive); equal to frame_start for a single image. With orbit=True and no frame_end, one full turn is rendered. | |
| scene_url | No | https link to a .blend, a .py script or a 3D file (.glb/.gltf/.fbx/.usd/.obj/.stl/.ply/.abc; a Gaussian splat .spz or 3DGS .ply opens with Blender 5.3); the service fetches it (e.g. the sample https://render.janction.jp/samples/cube_scene.py, or a 12-hour /upload link). A .gltf or .obj also brings its .bin / .mtl / textures from the same folder. | |
| asset_urls | No | Extra files sent with the scene: https links (textures, glTF .bin) or 'polyhaven:<id>' CC0 assets from asset_search ('polyhaven:<id>@2k' for 2k textures). A .blend finds them through relative paths (same folder); a script through os.environ['JR_ASSETS_DIR'] or the jr_assets helpers. | |
| compare_to | No | job_id of an earlier final render of this key to compare with: when this render finishes, compare.mp4 shows before / after side by side (frames matched by number), with compare.gif and compare.json (most changed frames). | |
| notify_url | No | Optional https URL that receives one JSON POST when the final render finishes (job.done / job.failed, with download links), so nobody has to poll. | |
| environment | No | Lighting preset: '' (the scene's own world), 'studio', 'sunset', 'overcast' or 'night' (bundled HDRIs; a good first render for scenes without lighting work), or 'compare' (preview only: all four in one labeled 2x2 image, to pick one). | |
| frame_start | No | First frame to render (inclusive). | |
| probe_frame | No | With auto_samples: the frame to test (0 = the middle frame). | |
| test_frames | No | test='contiguous': how many frames from frame_start to test (1-24, default 10; 0 = default). | |
| transparent | No | True renders on a transparent background (alpha) for product shots and overlays; png / exr / webm / gif / webp keep it, mp4 and prores cannot. The preview sheet shows it over dark grey. | |
| auto_samples | No | True (final, Cycles, 100 frames or more): a small test render of one frame picks the lowest samples, up to samples, that looks the same as samples; billed like a preview. A shorter final skips the test and renders at samples (the reply's auto_samples.summary says so). render_estimate with it shows the test's cost and the saving. | |
| orbit_frames | No | Number of frames for one full turn (default 24). | |
| orbit_target | No | Object name or 'x,y,z' to centre the orbit on (default: the scene's main objects). | |
| scene_script | No | The scene as bpy Python code (text). No file and no local Blender needed; the service runs it in Blender 5.0 (5.2 or 5.3 with blender='5.2' / '5.3'). Blender 5.0 API notes: materials are node-based, so set a colour on the Principled BSDF (mat.node_tree.nodes['Principled BSDF'].inputs['Base Color'].default_value = (r, g, b, 1)); mat.diffuse_color only affects the viewport; do not set Material.use_nodes. Animate with obj.keyframe_insert() (action.fcurves no longer exists; set bpy.context.preferences.edit.keyframe_new_interpolation_type = 'LINEAR' first for constant speed). Build the scene, camera and frame range only; leave resolution, samples and denoising to the service. Helpers: `import jr_assets`, then jr_assets.frame_camera(margin=1.1) points the camera at every object and fits them in the frame; jr_assets.import_model('<id>'), jr_assets.material('<id>') and jr_assets.world_hdri('<id>') use Poly Haven assets passed in asset_urls. | |
| allow_missing | No | True renders even though scene_info found files the scene uses that were not sent (missing images render pink or black, objects from a missing linked .blend are absent). Only when the user accepted that; otherwise the final is refused with MISSING_FILES and nothing is charged. | |
| orbit_distance | No | Multiplier for the orbit camera distance (default 1.0). | |
| idempotency_key | No | Any string up to 128 characters that identifies this order: sending the same key again returns the first job instead of rendering twice (a different body with the same key is refused). | |
| orbit_elevation | No | Orbit camera elevation in degrees (default 18). | |
| storage_project | No | JANCTION Storage project id to continue (from a Storage project's Render again); the result is saved into that project when saving to Storage is on for this key, otherwise ignored. | |
| environment_visible | No | False hides the HDRI from the camera (flat grey backdrop, HDRI lighting only). | |
| environment_strength | No | Multiplier for the HDRI preset's brightness (default 1.0). |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes |