All pages
Reference
GET
/api/v1/renders/{id}
Requires the renders:read scope.
Check a render. This is the call your poll loop makes. Polling is free and uncounted.
Request
curl -s "https://omniscape.io/api/v1/renders/rnd_7ef2da3bde9a" \
-H "Authorization: Bearer $OMNISCAPE_API_KEY"Response
{
"object": "render",
"id": "rnd_7ef2da3bde9a",
"type": "aesthetic_quote",
"status": "completed",
"progress": 100,
"created_at": "2026-08-24T14:20:55.225Z",
"updated_at": "2026-08-24T14:30:08.443Z",
"completed_at": "2026-08-24T14:30:08.442Z",
"asset": {
"url": "https://omniscape.io/api/v1/renders/rnd_7ef2da3bde9a/download",
"expires_at": null,
"content_type": null,
"width": null,
"height": null,
"byte_size": null,
"duration_sec": 553.2
},
"error": null,
"idempotency_key": "my-job-0001",
"metadata": { "campaign": "spring" }
}Notes
- status is one of queued, processing, completed, failed, canceled. Only completed, failed and canceled are terminal — branch on those and keep polling on anything else, so a status added later does not spin your loop forever.
- asset is null until status is completed. Read asset.url, do not build it yourself.
- When status is failed, error is { code, message } with one of render_failed, render_timeout, render_rejected, render_canceled.
- Known issue: progress does not move. It sits at 0 for the whole render and jumps to 100 at the end. Drive your UI off status, not progress.
- Known issue: asset.duration_sec currently reports render wall-clock rather than the length of the video. Do not rely on it; probe the file.
- A render id that is not yours returns 404 render_not_found — the same answer as one that does not exist, so the API cannot be used to discover whether an id is real.
Codes this call can return are on Error handling. If something is behaving unexpectedly, Troubleshooting is organised by symptom.