slug for a job. Use the job id for validation, rendering, monitoring, and downloads.
External API v1 requires validation for each new job. If a job already reports
validated, continue to the render step instead of starting validation again.Complete request flow
The workflow uses three values:Prerequisites
- A Renderjuice API key with access to the target workspace. See the API overview.
- A
.blendor.zipfile smaller than 5 GiB. The shell examples usecurlandjq.
1. Create an upload target
CallPOST /uploads with the source filename and its matching file type:
2. Upload the source file
Send the file bytes touploadUrl with PUT:
2xx response before creating the job. Request a new upload target if expiresAt has passed.
3. Create the job
CallPOST /jobs with the upload slug after the PUT succeeds:
created status:
job_id for each request that follows. The upload slug has completed its role.
4. Start validation
Validation inspects the Blender project and records the scenes, cameras, view layers, frame settings, add-ons, and resource requirements that Renderjuice needs for rendering. It runs as an asynchronous job. CallPOST /jobs/{id}/validate with an empty object to use the active scene and detected file defaults:
.blend file or scene, send validationConfig to select pathToFileForRender and sceneToRender. The endpoint reference also documents bundled add-on selection.
New jobs created through external API v1 start as
created, and the public API does not expose reuse of a previous job’s validation. If you resume an integration and GET /jobs/{id} reports validated, proceed to rendering without calling validation again.5. Wait for validation
UseGET /jobs/{id} as the source of truth for job state. The endpoint returns the job under data:
validated, failed, or canceled.
6. Start the render
CallPOST /jobs/{id}/render after validation succeeds. colorManagementPreset is required. Use default unless the project uses ACES:
frameRanges, activeCamera, activeViewLayer, or outputFormat when the render should differ from the validated project.
7. Monitor the render
PollGET /jobs/{id} until the job reaches a terminal status:
GET /jobs/{id}/progress for frame counters while the render runs:
null before counters exist. Treat data.status from GET /jobs/{id} as the completion signal. Frame counts do not replace job status.
The
onRenderComplete webhook can notify your integration when a render completes. Fetch the job after receiving the event, confirm its status, then request the downloads.
8. Download the outputs
CallGET /jobs/{id}/downloads after the job reaches completed:
frameOutputs and compositeNodeOutputs for individual files. Each entry includes its signed url and preserved fileName; compositor outputs can include relativePath. The transforms object contains ZIP and video output states. Download the files before their signed URLs expire.
The frames and compositeNodes URL arrays remain available for older integrations. New integrations should use the structured output fields.
Failures, cancellation, and retries
GET /jobs/{id} returns failedReason when Renderjuice can provide a client-facing failure description. Stop the workflow on failed or canceled; do not continue to render or download.
Use POST /jobs/{id}/cancel to cancel work that has not finished. The start-render endpoint supports idempotent retries: a repeated request returns the current job and sets X-Idempotent-Replay: true after rendering has started. Do not assume that other POST endpoints share this retry behavior.
