Quickstart
A personalized video starts as a template: a normal video composition in which some
layers are placeholders — {name}, {policyType} — instead of fixed text. Publish the
template and it becomes a dynamic movie: a named, renderable thing that produces a
different video for every set of values you pass it.
There are two ways to build that template, and they end in the same place. Pick one — each tutorial is about five minutes of reading and a two-minute video.
Connect the FX Express MCP server to Claude and describe the video you want. The agent authors, compiles, and publishes the template.
Build it in the editor →Start from a blank template in the browser editor: add scenes and layers by hand, and make a layer dynamic by typing a placeholder into it.
Both tutorials build the same three-scene insurance-quote video, publish it as a dynamic movie, and finish in the Console’s Dynamic Movies section by rendering two variants of it — a different name and a different plan in each.
Before you start
You need an ImpossibleFX account. If you don’t have one, sign up here — the free tier covers everything in both tutorials.
Log in to the Console and click New Project. Give it a name and pick a region. Your project gets a Project ID (a UUID); both tutorials need it, and so does every render request.
If you are taking the agent path, you can skip this and ask the agent to create the project instead — it will ask you which region.
Choose a region near your end users for the best playback performance. See Regions & Endpoints for the full list.
Render from your app
The Console’s Play tab is the fastest way to see two variants side by side, but it is
only a preview of what the API does. Once a dynamic movie is published, any application can
render it by POSTing the same parameters you typed into that form. Use the name you gave the
movie when you published it — insurance-quote in the agent tutorial, quote-demo in the
editor one:
curl -X POST https://render.impossible.io/v2/render/YOUR-PROJECT-ID \
-H "Content-Type: application/json" \
-d '{
"movie": "insurance-quote",
"params": {
"name": "Alex",
"policyType": "Comprehensive"
}
}' const response = await fetch(
"https://render.impossible.io/v2/render/YOUR-PROJECT-ID",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
movie: "insurance-quote",
params: {
name: "Alex",
policyType: "Comprehensive",
},
}),
}
);
const { token } = await response.json();
console.log("Render token:", token); import requests
response = requests.post(
"https://render.impossible.io/v2/render/YOUR-PROJECT-ID",
json={
"movie": "insurance-quote",
"params": {
"name": "Alex",
"policyType": "Comprehensive",
},
},
)
token = response.json()["token"]
print("Render token:", token) The API returns a token. Use it to retrieve the rendered video:
https://render.impossible.io/v2/render/TOKEN.mp4
Open that URL in a browser — the personalized video is there. Change name and
policyType, and you get a different token and a different video.
By default, render requests don’t require API credentials — the project ID is enough to render. A project can be set to require authentication, and then every render request has to carry your API Key. See Credentials.
What’s next?
- Rendering Videos — Retrieval modes, streaming, uploading, and multi-region rendering.
- Integrations — Personalized videos in JW Player, Video.js, Vimeo, and other players.
- SDKs — Client libraries instead of raw HTTP calls.
- Batch Rendering — Thousands of variants from a spreadsheet or a database.