ProductsServicesDocsPricingAboutContact Log in Sign up

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

ModeLatencyHow it worksBest for
renderHighestRenders the entire video first, then delivers it in one piece.Downloads, guaranteed smooth playback
getMediumStarts delivering as soon as frames are available. Progressive download.Default mode. Good balance of speed and reliability
playLowestStreams immediately, rendering only the frames needed for the current playback position.Real-time playback, interactive use

Format compatibility

Not all formats support all modes:

Formatrendergetplay
MP4Yes
WebMYesYesYes
FLVYesYesYes
HLS (m3u8)YesYes
DASH (mpd)YesYes
JPG / PNG / TIFYes
* Tip

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"
    }
  }
}
i Note

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 IDLocationCountry
us-east-1VirginiaUSA
us-west-2OregonUSA
eu-west-1DublinIreland
eu-central-1FrankfurtGermany
ap-southeast-2SydneyAustralia

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.

i Note

Need a region not listed here? ImpossibleFX can deploy dedicated instances in any AWS region. Contact us for details.