# Introducing Async Renders for Videos, PDFs, Image Generation

> Generate any render with "async" field, get a job back instantly, and collect the result by polling or webhook. Built for Zapier, Make and AI agents.

- **Author**: Rishi Mohan
- **Published**: 2026-08-25
- **Tags**: Updates, API, Video, PDF
- **Read time**: 3 min read
- **URL**: https://orshot.com/blog/async-video-rendering-api

---

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.

![Sync holds the connection for the whole render. Async returns a job instantly and the render runs server-side.](https://orshot.com/blog/async-render-jobs/sync-vs-async.webp)

### 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.

```js
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.

```js
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.

![The job lifecycle: queued, processing, then succeeded with your render or failed with an actionable error](https://orshot.com/blog/async-render-jobs/job-lifecycle.webp)

### 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](https://orshot.com/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.

[Read the Docs](https://orshot.com/docs/api-reference/async-render-start)

Async renders are live on all plans today. Start one with `mode: "async"` and never lose a long render again.