{"openapi":"3.1.0","info":{"title":"JANCTION Render","version":"0.4.259","description":"Render Blender scenes and 3D models on cloud GPUs: previews in seconds, then product shots, turntables, animations or stills as PNG or MP4. Operated by JasmyLab Inc. Get a key with createKey (or tryPreview), send it as X-API-Key. Guides: /llms.txt (Chinese: /zh/llms.txt)."},"servers":[{"url":"https://render.janction.jp"}],"paths":{"/v1/keys":{"post":{"summary":"Create a free API key (no sign-up)","operationId":"createKey","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Key V1 Keys Post"}}}}},"description":"Create a free API key (no sign-up). Keep api_key secret and send it as the X-API-Key header on every other call.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string"},"source":{"type":"string"},"found_via":{"type":"string"}}}}}},"security":[]}},"/v1/try":{"post":{"summary":"First preview without a key: renders the sample or your scene_url / scene_script in seconds and returns the image links ","description":"First preview without a key: renders the sample or your scene_url / scene_script in seconds and returns the image links and a new free API key.","operationId":"tryPreview","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Try Preview V1 Try Post"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"scene_script":{"type":"string"},"scene_url":{"type":"string","format":"uri"},"frames":{"items":{"type":"integer"},"type":"array","description":"preview: 1-4 frame numbers"},"width":{"type":"integer","description":"final: at most 1920x1080 pixels per frame on free time, 3840x2160 with prepaid credit; preview: scaled to 1280x720"},"height":{"type":"integer","description":"final: at most 1920x1080 pixels per frame on free time, 3840x2160 with prepaid credit; preview: scaled to 1280x720"},"samples":{"type":"integer"},"camera":{"type":"string"},"environment":{"type":"string"},"blender":{"type":"string"},"engine":{"type":"string"}}}}}},"security":[]}},"/v1/jobs":{"post":{"summary":"Render a Blender scene on cloud GPUs","operationId":"renderScene","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Submit Job V1 Jobs Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"description":"Render a Blender scene on cloud GPUs. Send scene_script (bpy code you write), scene_url (https .blend, .py or 3D file) or scene_id. kind=preview (1-4 frames tiled, seconds) first; kind=final only after the user approves the preview and the estimate. Returns job_id.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"scene_id":{"type":"string","description":"from POST /v1/files, POST /v1/files/url or an earlier job; or send scene_script / scene_url instead"},"scene_script":{"type":"string","description":"the scene as bpy Python code (text), used when scene_id is absent"},"scene_url":{"type":"string","description":"https link to a .blend, .py or 3D file, used when scene_id is absent","format":"uri"},"asset_urls":{"items":{"type":"string"},"type":"array","description":"extra files with scene_script / scene_url: https links or 'polyhaven:<id>' CC0 assets"},"kind":{"enum":["preview","final","info"],"type":"string"},"frames":{"items":{"type":"integer"},"type":"array","description":"preview: 1-4 frame numbers"},"frame_start":{"type":"integer"},"frame_end":{"type":"integer","description":"final: up to 3,000 frames per call (frame_start..frame_end); longer than 240 runs as parts under one job id"},"width":{"type":"integer","description":"final: at most 1920x1080 pixels per frame on free time, 3840x2160 with prepaid credit; preview: scaled to 1280x720"},"height":{"type":"integer","description":"final: at most 1920x1080 pixels per frame on free time, 3840x2160 with prepaid credit; preview: scaled to 1280x720"},"samples":{"type":"integer"},"fps":{"type":"integer"},"output":{"enum":["auto","png","exr","mp4","webm","prores","gif","webp","blend","prores4444"],"type":"string"},"camera":{"type":"string"},"cameras":{"items":{"type":"string"},"type":"array"},"environment":{"enum":["","studio","sunset","overcast","night","compare"],"type":"string"},"environment_strength":{"type":"number"},"environment_visible":{"type":"boolean"},"blender":{"enum":["","5.0","5.2"],"type":"string"},"engine":{"enum":["","cycles","eevee"],"type":"string"},"transparent":{"type":"boolean"},"orbit":{"type":"boolean"},"orbit_frames":{"type":"integer"},"orbit_elevation":{"type":"number"},"orbit_target":{"type":"string"},"orbit_distance":{"type":"number"},"preset":{"enum":["","product","turntable","animation"],"type":"string"},"max_yen":{"type":"integer","description":"ceiling for this job; 0 = only if it fits the free time"},"notify_url":{"type":"string","description":"https; one signed POST when the job finishes","format":"uri"},"compare_to":{"type":"string","description":"final only: job_id of an earlier final of this key (j_... or b_...); when this render finishes the job also has compare.mp4 (before / after side by side, frames matched by number), compare.gif, compare.png and compare.json (change score per frame, most changed frames). Missing or expired files are explained in compare, the render itself still finishes"},"passes":{"type":"array","items":{"type":"string","enum":["depth","mist","normal","diffuse","glossy","emission","ao","shadow_catcher","crypto_object","crypto_material"]},"description":"final only, Cycles: render passes for compositing. Each frame becomes one multilayer OpenEXR (frame_NNNN.exr) holding the denoised beauty and these passes; output must be 'exr' or 'auto'. passes.json lists the layers found in the files"},"variations":{"type":"array","items":{"type":"object","additionalProperties":false,"description":"one variant; anything left out uses the job's own settings","properties":{"label":{"type":"string","maxLength":40,"description":"short text on the tile (default: what the variant changes)"},"environment":{"type":"string","enum":["","studio","sunset","overcast","night"]},"environment_strength":{"type":"number","exclusiveMinimum":0,"maximum":10},"camera":{"type":"string","description":"an existing camera object name"},"colors":{"type":"object","additionalProperties":{"description":"'#rrggbb' / '#rrggbbaa' (sRGB, like Blender's colour picker) or [r, g, b] / [r, g, b, a] (linear, 0-1)","anyOf":[{"type":"string","pattern":"^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"},{"type":"array","items":{"type":"number","minimum":0,"maximum":1},"minItems":3,"maxItems":4}]},"maxProperties":16,"description":"object name -> colour"}}},"minItems":2,"maxItems":8,"description":"preview only: 2-8 variants of one frame, each rendered on its own GPU and tiled in one labelled sheet; the job lists each variant's render_final arguments. Not with cameras, orbit or environment='compare'"},"colors":{"type":"object","additionalProperties":{"description":"'#rrggbb' / '#rrggbbaa' (sRGB, like Blender's colour picker) or [r, g, b] / [r, g, b, a] (linear, 0-1)","anyOf":[{"type":"string","pattern":"^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"},{"type":"array","items":{"type":"number","minimum":0,"maximum":1},"minItems":3,"maxItems":4}]},"description":"object name -> colour for its material's Principled Base Color (a copy per render; the scene file is unchanged)"},"deliver":{"type":"array","items":{"type":"string","enum":["x","vertical","square"]},"description":"final animations only: extra MP4s made from the rendered frames on the server (no extra GPU time). x = H.264 + silent AAC that fits X (up to 2 min 20 s, 512 MB, 1920x1080 or 1280x720, yuv420p, faststart) as social_x.mp4; vertical = 1080x1920 (social_vertical.mp4); square = 1080x1080 (social_square.mp4). The whole frame is kept on a blurred fill, nothing is cropped"},"auto_samples":{"type":"boolean","description":"final, Cycles: pick the samples automatically (samples is then the maximum). A small test render of one frame runs first, billed like a preview; POST /v1/estimate shows its cost and the possible saving"},"probe_frame":{"type":"integer","description":"auto_samples: the frame to test (default: the middle frame)"}}}}}}},"get":{"summary":"This account's recent jobs and the scene_ids still kept, to continue earlier work.","operationId":"listRenderJobs","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"summary","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Summary"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Jobs V1 Jobs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"description":"This account's recent jobs and the scene_ids still kept, to continue earlier work."}},"/v1/estimate":{"post":{"summary":"Estimate a render before starting it: GPU seconds, wall time (estimate.human), queue wait, cost in JPY and whether the f","description":"Estimate a render before starting it: GPU seconds, wall time (estimate.human), queue wait, cost in JPY and whether the free GPU time covers it. Same body as renderScene. Tell the user the time and price, then ask before a final.","operationId":"estimateRender","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Estimate Job V1 Estimate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"scene_id":{"type":"string","description":"from POST /v1/files, POST /v1/files/url or an earlier job; or send scene_script / scene_url instead"},"scene_script":{"type":"string","description":"the scene as bpy Python code (text), used when scene_id is absent"},"scene_url":{"type":"string","description":"https link to a .blend, .py or 3D file, used when scene_id is absent","format":"uri"},"asset_urls":{"items":{"type":"string"},"type":"array","description":"extra files with scene_script / scene_url: https links or 'polyhaven:<id>' CC0 assets"},"kind":{"enum":["preview","final","info"],"type":"string"},"frames":{"items":{"type":"integer"},"type":"array","description":"preview: 1-4 frame numbers"},"frame_start":{"type":"integer"},"frame_end":{"type":"integer","description":"final: up to 3,000 frames per call (frame_start..frame_end); longer than 240 runs as parts under one job id"},"width":{"type":"integer","description":"final: at most 1920x1080 pixels per frame on free time, 3840x2160 with prepaid credit; preview: scaled to 1280x720"},"height":{"type":"integer","description":"final: at most 1920x1080 pixels per frame on free time, 3840x2160 with prepaid credit; preview: scaled to 1280x720"},"samples":{"type":"integer"},"fps":{"type":"integer"},"output":{"enum":["auto","png","exr","mp4","webm","prores","gif","webp","blend","prores4444"],"type":"string"},"camera":{"type":"string"},"cameras":{"items":{"type":"string"},"type":"array"},"environment":{"enum":["","studio","sunset","overcast","night","compare"],"type":"string"},"environment_strength":{"type":"number"},"environment_visible":{"type":"boolean"},"blender":{"enum":["","5.0","5.2"],"type":"string"},"engine":{"enum":["","cycles","eevee"],"type":"string"},"transparent":{"type":"boolean"},"orbit":{"type":"boolean"},"orbit_frames":{"type":"integer"},"orbit_elevation":{"type":"number"},"orbit_target":{"type":"string"},"orbit_distance":{"type":"number"},"preset":{"enum":["","product","turntable","animation"],"type":"string"},"max_yen":{"type":"integer","description":"ceiling for this job; 0 = only if it fits the free time"},"compare_to":{"type":"string","description":"final only: job_id of an earlier final of this key (j_... or b_...); when this render finishes the job also has compare.mp4 (before / after side by side, frames matched by number), compare.gif, compare.png and compare.json (change score per frame, most changed frames). Missing or expired files are explained in compare, the render itself still finishes"},"passes":{"type":"array","items":{"type":"string","enum":["depth","mist","normal","diffuse","glossy","emission","ao","shadow_catcher","crypto_object","crypto_material"]},"description":"final only, Cycles: render passes for compositing. Each frame becomes one multilayer OpenEXR (frame_NNNN.exr) holding the denoised beauty and these passes; output must be 'exr' or 'auto'. passes.json lists the layers found in the files"},"variations":{"type":"array","items":{"type":"object","additionalProperties":false,"description":"one variant; anything left out uses the job's own settings","properties":{"label":{"type":"string","maxLength":40,"description":"short text on the tile (default: what the variant changes)"},"environment":{"type":"string","enum":["","studio","sunset","overcast","night"]},"environment_strength":{"type":"number","exclusiveMinimum":0,"maximum":10},"camera":{"type":"string","description":"an existing camera object name"},"colors":{"type":"object","additionalProperties":{"description":"'#rrggbb' / '#rrggbbaa' (sRGB, like Blender's colour picker) or [r, g, b] / [r, g, b, a] (linear, 0-1)","anyOf":[{"type":"string","pattern":"^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"},{"type":"array","items":{"type":"number","minimum":0,"maximum":1},"minItems":3,"maxItems":4}]},"maxProperties":16,"description":"object name -> colour"}}},"minItems":2,"maxItems":8,"description":"preview only: 2-8 variants of one frame, each rendered on its own GPU and tiled in one labelled sheet; the job lists each variant's render_final arguments. Not with cameras, orbit or environment='compare'"},"colors":{"type":"object","additionalProperties":{"description":"'#rrggbb' / '#rrggbbaa' (sRGB, like Blender's colour picker) or [r, g, b] / [r, g, b, a] (linear, 0-1)","anyOf":[{"type":"string","pattern":"^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"},{"type":"array","items":{"type":"number","minimum":0,"maximum":1},"minItems":3,"maxItems":4}]},"description":"object name -> colour for its material's Principled Base Color (a copy per render; the scene file is unchanged)"},"deliver":{"type":"array","items":{"type":"string","enum":["x","vertical","square"]},"description":"final animations only: extra MP4s made from the rendered frames on the server (no extra GPU time). x = H.264 + silent AAC that fits X (up to 2 min 20 s, 512 MB, 1920x1080 or 1280x720, yuv420p, faststart) as social_x.mp4; vertical = 1080x1920 (social_vertical.mp4); square = 1080x1080 (social_square.mp4). The whole frame is kept on a blurred fill, nothing is cropped"},"auto_samples":{"type":"boolean","description":"final, Cycles: pick the samples automatically (samples is then the maximum). A small test render of one frame runs first, billed like a preview; POST /v1/estimate shows its cost and the possible saving"},"probe_frame":{"type":"integer","description":"auto_samples: the frame to test (default: the middle frame)"}}}}}}}},"/v1/jobs/{job_id}":{"get":{"summary":"Status of a render job (queued, running, done, failed), eta.human, and when done the image or MP4 links (no key needed, ","operationId":"getRenderJob","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Job V1 Jobs  Job Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"description":"Status of a render job (queued, running, done, failed), eta.human, and when done the image or MP4 links (no key needed, about 24 hours). Show the links to the user. Poll every 10-20 s while running."},"delete":{"summary":"Cancel a queued or running job","operationId":"cancelRenderJob","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Cancel Job V1 Jobs  Job Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"description":"Cancel a queued or running job. Only GPU time already used is charged."}},"/v1/assets/search":{"get":{"summary":"Find free CC0 models, textures or HDRIs on Poly Haven by words; pass 'polyhaven:<id>' in asset_urls and load them in the","description":"Find free CC0 models, textures or HDRIs on Poly Haven by words; pass 'polyhaven:<id>' in asset_urls and load them in the script with jr_assets.","operationId":"searchAssets","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"kind","in":"query","required":false,"schema":{"type":"string","default":"models","title":"Kind"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Assets Search V1 Assets Search Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me":{"get":{"summary":"This account's free GPU time left, balance in JPY, limits and usage","operationId":"getAccount","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Me V1 Me Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"description":"This account's free GPU time left, balance in JPY, limits and usage. No GPU time."}},"/v1/health":{"get":{"summary":"Whether GPU workers are online, the queue and the expected wait","operationId":"getServiceStatus","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Health Route V1 Health Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"description":"Whether GPU workers are online, the queue and the expected wait. No GPU time."}},"/v1/jobs/{job_id}/share":{"post":{"summary":"Publish a finished render as a public page","description":"Publish a finished render as a public page. Only when the user asks to share; return the url to them.","operationId":"shareRender","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Share Job V1 Jobs  Job Id  Share Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"note":{"type":"string"},"prompt":{"type":"string"},"include_script":{"type":"boolean"},"listed":{"type":"boolean"}}}}}}},"delete":{"summary":"Take down the public page made with shareRender.","operationId":"unshareRender","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Unshare Job V1 Jobs  Job Id  Share Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"description":"Take down the public page made with shareRender."}}},"components":{"schemas":{"Body_create_drop_v1_drops_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"},"html":{"type":"string","title":"Html","default":""},"lang":{"type":"string","title":"Lang","default":"en"}},"type":"object","required":["file"],"title":"Body_create_drop_v1_drops_post"},"Body_upload_assets_v1_files__file_id__assets_post":{"properties":{"files":{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array","title":"Files"}},"type":"object","required":["files"],"title":"Body_upload_assets_v1_files__file_id__assets_post"},"Body_upload_file_v1_files_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_file_v1_files_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"}}},"security":[{"ApiKeyAuth":[]}]}