Every render, whether video, PDF or image, can now run in the background. Add one field to your render request and the API replies in under a second with a job; the render runs on our servers and you collect the result whenever it's ready, by polling or webhook.
This matters most for video. A 60-second 1080p render can take a couple of minutes, and that's longer than most HTTP clients will wait: Zapier gives you about 30 seconds, Make about a minute, most AI agents cut off at two. The render finished fine on our side, but your integration never saw the result. It's just as useful for big multi-page PDFs and for firing off many image renders at once and collecting them as they land.

One field, same request
Everything about your render request stays the same: modifications, video options, Smart Resize, publishing. You only add mode: "async" to the response object.
const res = await fetch("https://api.orshot.com/v1/studio/render", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer <ORSHOT_API_KEY>",
},
body: JSON.stringify({
templateId: 1485,
modifications: { title: "Launch day!" },
response: { mode: "async", format: "mp4" }, // or "pdf", "png", …
videoOptions: { duration: 60, fps: 30 },
}),
});
const job = await res.json(); // HTTP 202, in under a second
// { id: 1204, status: "queued", finished: false, self: "https://api.orshot.com/v1/studio/render-jobs/1204" }Collect the result your way
Poll the job until finished is true. Polling doesn't count against your render rate limit, so check as often as you like.
const job = await fetch(`https://api.orshot.com/v1/studio/render-jobs/${id}`, {
headers: { Authorization: "Bearer <ORSHOT_API_KEY>" },
}).then((r) => r.json());
if (job.finished && job.status === "succeeded") {
// job.result.data.content → your video URL
}Or pass a webhook_url with the render request and we POST the finished job to you: no polling at all. Delivery retries three times, and the job stays pollable either way.
The job's result is the exact same response body a synchronous render returns, so the code that handles your renders today doesn't change. And when something goes wrong, the job carries an error that tells you what to fix, plus a stable error_code you can branch on.

Built for automations and agents
This is what async mode unlocks:
- Zapier and Make: fire the render in one step, pick the result up in a later step or via webhook. No more timeouts on long videos.
- AI agents: Orshot for agents already uses async under the hood. Agents render long videos in the background and keep working while they wait.
- Batch pipelines: start fifty renders in fifty fast requests, then collect them all as they finish.
Images and PDFs render in seconds, so sync mode stays the default and nothing changes for existing integrations. Async is there the moment a render outgrows an HTTP timeout.
Async renders are live on all plans today. Start one with mode: "async" and never lose a long render again.






