Project API
The Project API lets you manage projects, upload assets (videos, images, fonts, sounds), and work with dynamic movie templates. Unlike the Render API, which handles video rendering and retrieval, the Project API covers everything else — creating projects, managing their contents, and publishing them to render clusters.
Base URL
All Project API requests go to a regional endpoint:
https://api-{region}.impossible.io
Replace {region} with your project’s region:
| Region | Endpoint |
|---|---|
| EU West (Ireland) | api-eu-west-1.impossible.io |
| US East (Virginia) | api-us-east-1.impossible.io |
| US West (Oregon) | api-us-west-2.impossible.io |
| Asia Pacific (Singapore) | api-ap-southeast-1.impossible.io |
| Asia Pacific (Sydney) | api-ap-southeast-2.impossible.io |
Authentication
Every Project API request requires your API Key and API Secret, sent as HTTP Basic authentication credentials. The API Key is the username and the API Secret is the password.
curl -u YOUR_API_KEY:YOUR_API_SECRET \
https://api-eu-west-1.impossible.io/v1/list/project
Or as an Authorization header with a Base64-encoded key:secret string:
curl -H "Authorization: Basic BASE64_ENCODED_KEY_SECRET" \
https://api-eu-west-1.impossible.io/v1/list/project
Don’t have API credentials yet? See Credentials for how to create an API Key and Secret in the Console.
Projects
Projects are the top-level containers for your video templates. Each project holds assets (media files, fonts), movie compositions, and configuration.
List all projects
Returns a list of all projects in your account.
Endpoint: GET /v1/list/project
curl -u YOUR_API_KEY:YOUR_API_SECRET \
https://api-eu-west-1.impossible.io/v1/list/project import { ImpossibleFX } from "impossiblefx";
const client = new ImpossibleFX();
client.config.apikey = "YOUR_API_KEY";
client.config.apisecret = "YOUR_API_SECRET";
client.config.region = "eu-west-1";
const projects = await client.listProjects(); import impossiblefx as fx
client = fx.Client(
api_key="YOUR_API_KEY",
api_secret="YOUR_API_SECRET",
region="eu-west-1"
)
projects = client.list_projects() Create a project
Creates a new empty project with the given name.
Endpoint: POST /v1/project/{name}
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
name | String | Yes | — | Project name (URL path parameter). Must be unique within your account. |
curl -X POST -u YOUR_API_KEY:YOUR_API_SECRET \
https://api-eu-west-1.impossible.io/v1/project/my-new-project
The response includes the project UID, which you’ll use in all subsequent API calls for this project.
Delete a project
Permanently deletes a project and all of its assets.
Endpoint: DELETE /v1/project/{project-uid}
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
project-uid | String | Yes | — | The unique project identifier (URL path parameter). |
curl -X DELETE -u YOUR_API_KEY:YOUR_API_SECRET \
https://api-eu-west-1.impossible.io/v1/project/abc123-def456
This action is irreversible. All assets, movies, and configuration within the project will be permanently deleted.
Publish a project to additional regions
Publishes a project to a render cluster in another region. This is only needed if you want your project available for rendering in multiple regions — for example, to serve users in both Europe and Asia with low latency.
Most projects don’t need this. By default, your project is available in the region where it was created, and render requests sent to the global endpoint are routed to the nearest region that has the project. Publishing to additional clusters lets you geo-distribute a project so that requests from any region are served locally.
Endpoint: POST /v1/publish/{project-uid}/{cluster-name}
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
project-uid | String | Yes | — | The unique project identifier (URL path parameter). |
cluster-name | String | Yes | — | Target render cluster name (URL path parameter), e.g. "ap-southeast-1". |
# Publish a project (created in eu-west-1) to the Singapore region
curl -X POST -u YOUR_API_KEY:YOUR_API_SECRET \
https://api-eu-west-1.impossible.io/v1/publish/abc123-def456/ap-southeast-1
If you update a project’s assets or templates after publishing to other regions, publish again to sync the changes across all regions.
Assets
Assets are the media files inside a project — videos, images, fonts, and audio files used by your movie templates. The assets API lets you list, upload, retrieve, and delete these files.
List assets
Returns a list of all assets in a project.
Endpoint: GET /v1/list/data/{project-uid}
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
project-uid | String | Yes | — | The unique project identifier (URL path parameter). |
curl -u YOUR_API_KEY:YOUR_API_SECRET \
https://api-eu-west-1.impossible.io/v1/list/data/abc123-def456
Retrieve an asset
Downloads a specific asset file from a project.
Endpoint: GET /v1/data/{project-uid}/{filename}
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
project-uid | String | Yes | — | The unique project identifier (URL path parameter). |
filename | String | Yes | — | Asset filename including extension (URL path parameter), e.g. "background.mp4" or "logo.png". |
curl -u YOUR_API_KEY:YOUR_API_SECRET \
https://api-eu-west-1.impossible.io/v1/data/abc123-def456/background.mp4 \
--output background.mp4
Upload or update an asset
Uploads a new asset or replaces an existing one. The file contents go in the request body.
Endpoint: PUT /v1/data/{project-uid}/{filename}
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
project-uid | String | Yes | — | The unique project identifier (URL path parameter). |
filename | String | Yes | — | Destination filename including extension (URL path parameter). |
curl -X PUT -u YOUR_API_KEY:YOUR_API_SECRET \
--data-binary @logo.png \
https://api-eu-west-1.impossible.io/v1/data/abc123-def456/logo.png
For large video files (over 100 MB), use multipart upload instead for reliable transfers.
Delete an asset
Removes an asset from a project.
Endpoint: DELETE /v1/data/{project-uid}/{filename}
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
project-uid | String | Yes | — | The unique project identifier (URL path parameter). |
filename | String | Yes | — | Asset filename to delete (URL path parameter). |
curl -X DELETE -u YOUR_API_KEY:YOUR_API_SECRET \
https://api-eu-west-1.impossible.io/v1/data/abc123-def456/logo.png
Multipart upload
For large video files, use multipart upload to break the file into smaller chunks. This is more reliable than a single PUT request for large files, since individual chunks can be retried on failure.
The process has three steps: initiate the upload, send each chunk, then signal completion.
Step 1 — Initiate the upload
Endpoint: POST /chunked/videos/{project-uid}
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
project-uid | String | Yes | — | The unique project identifier (URL path parameter). |
name | String | Yes | — | Destination filename (query parameter). |
chunk_count | Integer | Yes | — | Total number of chunks (query parameter). |
chunk_size | Integer | Yes | — | Size of each chunk in bytes (query parameter). The last chunk can be smaller. |
curl -X POST -u YOUR_API_KEY:YOUR_API_SECRET \
"https://api-eu-west-1.impossible.io/chunked/videos/abc123-def456?chunk_count=5&chunk_size=10485760&name=hero-video.mp4"
The response includes an upload-id you’ll use for the remaining steps.
Step 2 — Upload each chunk
Send each chunk as a separate request. Chunks must all be the same size except the last one.
Endpoint: POST /chunked/videos/{project-uid}/{upload-id}/chunks
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
project-uid | String | Yes | — | The unique project identifier (URL path parameter). |
upload-id | String | Yes | — | Upload ID from step 1 (URL path parameter). |
chunk_id | Integer | Yes | — | Chunk number, starting from 0 (query parameter). |
curl -X POST -u YOUR_API_KEY:YOUR_API_SECRET \
--data-binary @chunk_0.bin \
"https://api-eu-west-1.impossible.io/chunked/videos/abc123-def456/upload-789/chunks?chunk_id=0"
Step 3 — Complete the upload
After all chunks are uploaded, signal that the upload is complete.
Endpoint: POST /chunked/videos/{project-uid}/{upload-id}/finished
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
project-uid | String | Yes | — | The unique project identifier (URL path parameter). |
upload-id | String | Yes | — | Upload ID from step 1 (URL path parameter). |
curl -X POST -u YOUR_API_KEY:YOUR_API_SECRET \
https://api-eu-west-1.impossible.io/chunked/videos/abc123-def456/upload-789/finished
The system assembles the chunks into the final asset file once this request completes.
Dynamic movies (SDLs)
Dynamic movies are templates defined using SDL (Scene Description Language) that can be created and managed programmatically via the API. For a guide on writing SDL, see SDL Scripting.
The SDL endpoints follow the same pattern as assets:
| Method | Endpoint | Description |
|---|---|---|
| GET | /v1/list/sdl/{project-uid} | List all dynamic movies in a project. |
| GET | /v1/sdl/{project-uid}/{name} | Retrieve a dynamic movie definition. |
| PUT | /v1/sdl/{project-uid}/{name} | Create or update a dynamic movie. Send the SDL as the request body. |
| DELETE | /v1/sdl/{project-uid}/{name} | Delete a dynamic movie. |
# Upload an SDL template
curl -X PUT -u YOUR_API_KEY:YOUR_API_SECRET \
-H "Content-Type: application/json" \
--data-binary @welcome-video.json \
https://api-eu-west-1.impossible.io/v1/sdl/abc123-def456/welcome-video
After creating or updating a dynamic movie, remember to publish the project for the changes to be available for rendering.
Error responses
| Status | Meaning |
|---|---|
| 200 | Success. |
| 201 | Created. Resource was created or updated. |
| 400 | Bad request. Check your request parameters. |
| 401 | Unauthorized. Check your API Key and Secret. |
| 403 | Forbidden. Your credentials don’t have access to this resource. |
| 404 | Not found. Project, asset, or SDL name doesn’t exist. |
| 409 | Conflict. Resource already exists (e.g. duplicate project name). |
| 500 | Server error. Retry with exponential backoff. |