Rendering Videos
Rendering a personalized video is a two-step process: submit a render request with your dynamic data, then retrieve the rendered video using the token you get back.
Making render requests
Send a POST request to the render endpoint with your project ID and dynamic data.
Endpoint: POST https://render.impossible.io/v2/render/{project-id}
curl -X POST https://render.impossible.io/v2/render/YOUR-PROJECT-ID \
-H "Content-Type: application/json" \
-d '{
"movie": "welcome-video",
"params": {
"name": "Alex",
"company": "Acme Inc"
}
}' const response = await fetch(
"https://render.impossible.io/v2/render/YOUR-PROJECT-ID",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
movie: "welcome-video",
params: { name: "Alex", company: "Acme Inc" },
}),
}
);
const { token } = await response.json(); import requests
response = requests.post(
"https://render.impossible.io/v2/render/YOUR-PROJECT-ID",
json={
"movie": "welcome-video",
"params": {"name": "Alex", "company": "Acme Inc"},
},
)
token = response.json()["token"] HttpClient client = HttpClient.newHttpClient();
String body = """
{"movie": "welcome-video",
"params": {"name": "Alex", "company": "Acme Inc"}}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://render.impossible.io/v2/render/YOUR-PROJECT-ID"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString()); Request body
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
movie | String | Object | Yes | — | The dynamic movie name, or an object mapping file extensions to movie names for multi-format rendering. |
params | Object | No | {} | Key-value pairs for your dynamic movie variables (names, text, image URLs, colors, etc.). |
parallel | Number | No | 1 | Number of distributed render servers to use. Higher values render faster for long videos. |
routingkey | String | No | "default" | Routing key for dedicated render clusters. Only needed for enterprise plans. |
upload | Object | Array | No | — | Upload task definition(s) to send the rendered video directly to third-party services. See Uploading below. |
Response
The API returns JSON with a render token:
{
"token": "v2:eu-west-1:abc123-def456-789"
}
Use this token to retrieve the rendered video.
Multi-format rendering
To render different movies for different output formats, pass an object instead of a string for movie:
{
"movie": {
"mp4": "welcome-video-hd",
"webm": "welcome-video-web",
"*": "welcome-video-default"
},
"params": { "name": "Alex" }
}
The * key is a fallback for any format not explicitly mapped.
Retrieving videos
Once you have a token, retrieve the video with a GET request. There are three retrieval modes, each with different latency and playback characteristics.
URL pattern: GET https://render.impossible.io/v2/{mode}/{token}.{format}
Example:
https://render.impossible.io/v2/render/v2:eu-west-1:abc123-def456-789.mp4
Retrieval modes
| Mode | Latency | How it works | Best for |
|---|---|---|---|
| render | Highest | Renders the entire video first, then delivers it in one piece. | Downloads, guaranteed smooth playback |
| get | Medium | Starts delivering as soon as frames are available. Progressive download. | Default mode. Good balance of speed and reliability |
| play | Lowest | Streams immediately, rendering only the frames needed for the current playback position. | Real-time playback, interactive use |
Format compatibility
Not all formats support all modes:
| Format | render | get | play |
|---|---|---|---|
| MP4 | Yes | — | — |
| WebM | Yes | Yes | Yes |
| FLV | Yes | Yes | Yes |
| HLS (m3u8) | Yes | Yes | — |
| DASH (mpd) | Yes | Yes | — |
| JPG / PNG / TIF | Yes | — | — |
For most use cases, MP4 with render mode gives the most reliable results. For real-time playback in the browser, use WebM with play mode. See Video Players for how to use render URLs with popular video players.
Uploading to third-party services
Instead of downloading the rendered video yourself, you can have it uploaded directly to a third-party service. Add an upload field to your render request.
Supported destinations
See the Upload Destinations reference for full configuration details for each service.
Upload task definition
Add the upload field to your render request body:
{
"movie": "welcome-video",
"params": { "name": "Alex" },
"upload": {
"extension": "mp4",
"destination": {
"type": "s3",
"bucket": "my-videos",
"key": "renders/alex-welcome.mp4",
"region": "us-east-1"
}
}
}
Sync vs async uploads
By default, uploads are synchronous — the API waits for the upload to finish and returns the result (e.g., the S3 URL or YouTube video ID).
For asynchronous uploads, set "async": true. The API returns immediately with HTTP 201 and processes the upload in the background. Use the onsuccess and onerror callbacks to get notified:
{
"movie": "welcome-video",
"params": { "name": "Alex" },
"upload": {
"extension": "mp4",
"async": true,
"onsuccess": "https://your-server.com/webhook/upload-done",
"onerror": "https://your-server.com/webhook/upload-failed",
"destination": {
"type": "s3",
"bucket": "my-videos",
"key": "renders/alex-welcome.mp4"
}
}
}
Async uploads are limited to 5 concurrent requests per account.
Regions & endpoints
ImpossibleFX runs on AWS infrastructure across five regions. All render requests go through a single global endpoint that routes to the region where your project lives.
Global endpoint: https://render.impossible.io
Available regions
| Region ID | Location | Country |
|---|---|---|
| us-east-1 | Virginia | USA |
| us-west-2 | Oregon | USA |
| eu-west-1 | Dublin | Ireland |
| eu-central-1 | Frankfurt | Germany |
| ap-southeast-2 | Sydney | Australia |
Choosing a region
When you create a project, you pick a region. Choose based on:
- Latency — Pick the region closest to your audience for fastest playback.
- Compliance — Some regulations require data to stay in specific geographies.
- Cost — Pricing is the same across all standard regions.
Multi-region publishing
You can publish a project to multiple regions to reduce latency for a global audience. Each region gets its own copy of your templates and assets.
Need a region not listed here? ImpossibleFX can deploy dedicated instances in any AWS region. Contact us for details.