Get started
Same account and commands from Node or Python. Agents: paste set up renda — https://renda.vochsel.com/llms.txt.
npx @rendahq/cli init # trial or sign in, MCP + skills for your agent
npx @rendahq/cli render chair.blend --res 1920x1080The Renda package
A small typed JSON file (*.renda.json) for what scene formats can't express: output, resolution, environment map, camera, animation, engine. Everything except scene.root is optional. JSON Schema: /api/v1/schema.json.
Examples
{
"version": 1,
"scene": {
"root": "./model.glb"
}
}Uploading and rendering
# 1. register each file by sha256; PUT bytes if the server doesn't have them
curl -X POST $RENDA/api/v1/uploads -H "authorization: Bearer $KEY" \
-d '{"filename":"robot.glb","size":48213,"sha256":"<hex>"}'
# → {"assetUri":"asset://<hex>","exists":false,"uploadUrl":"https://…"}
curl -X PUT --data-binary @robot.glb -H "content-type: application/octet-stream" "<uploadUrl>"
# 2. submit, using asset:// uris
curl -X POST $RENDA/api/v1/jobs -H "authorization: Bearer $KEY" \
-d '{"package":{"scene":{"root":"asset://<hex>"},"output":{"format":"png"}}}'
# 3. poll until status is succeeded, then download outputs[].url
curl $RENDA/api/v1/jobs/<id> -H "authorization: Bearer $KEY"The renda CLI and MCP server do the upload step for you. Full API: OpenAPI.
Fields
| Field | Type | Default | Notes |
|---|---|---|---|
| version | number | 1 | |
| name | string | ||
| assets | object | {} | |
| scene | object | ||
| scene.root | string | Asset id or uri of the main scene file. | |
| scene.include | object[] | [] | |
| scene.upAxis | "Y" | "Z" | Defaults to the source format's convention. | |
| scene.unitScale | number | 1 | |
| scene.materialOverrides | object | {} | Keys are material names or "*" for all. |
| camera | object | object | object | {"mode":"auto","fovDeg":35,"elevationDeg":20,"azimuthDeg":35,"padding":0.1} | |
| environment | object | ||
| environment.hdri | string | null | "studio" | Asset id/uri of an equirect .hdr/.exr, or "studio" | "sunset" | "night" built-ins. null = no environment lighting. |
| environment.intensity | number | 1 | |
| environment.rotationDeg | number | 0 | |
| environment.background | "hdri" | "transparent" | string | any[] | "hdri" | |
| lights | object | object | object | object[] | [] | |
| render | object | ||
| render.engine | "auto" | "blender-cycles" | "blender-eevee" | "blender-workbench" | "mitsuba" | "threejs" | "auto" | |
| render.resolution | any[] | [1920,1080] | |
| render.quality | "draft" | "standard" | "final" | "standard" | |
| render.samples | integer | null | null | Overrides the quality preset. |
| render.denoise | boolean | true | |
| render.seed | integer | 0 | |
| render.hardware | "auto" | "cpu" | "gpu" | "auto" | |
| animation | object | ||
| animation.frames | any[] | Inclusive [start, end]. | |
| animation.fps | number | 30 | |
| animation.step | integer | 1 | |
| animation.turntable | object | Orbit the camera around the scene bounds. | |
| animation.turntable.revolutions | number | 1 | |
| animation.turntable.axis | "up" | "X" | "Y" | "Z" | "up" | |
| output | object | ||
| output.format | "png" | "jpg" | "webp" | "exr" | "mp4" | "webm" | "gif" | "mov" | "png" | |
| output.passes | "beauty" | "alpha" | "depth" | "normal" | "albedo" | "mask"[] | ["beauty"] | |
| output.transparent | boolean | false | |
| output.video | object | ||
| output.video.codec | "h264" | "h265" | "vp9" | "prores" | "gif" | ||
| output.video.crf | integer | 18 | |
| output.keepFrames | boolean | false | Also return individual frames for video outputs. |