Platform Editor Pricing Docs Sign In Get Started

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:

RegionEndpoint
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, sent as a Bearer token in the Authorization header.

curl -H "Authorization: Bearer YOUR_API_KEY" \
  https://api-eu-west-1.impossible.io/v1/list/project
i Note

Don’t have an API Key yet? See Credentials for how to create one 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 -H "Authorization: Bearer YOUR_API_KEY" \
  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.region = "eu-west-1";

const projects = await client.listProjects();
import impossiblefx as fx

client = fx.Client(
    api_key="YOUR_API_KEY",
    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 -H "Authorization: Bearer YOUR_API_KEY" \
  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 -H "Authorization: Bearer YOUR_API_KEY" \
  https://api-eu-west-1.impossible.io/v1/project/abc123-def456
! Warning

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 -H "Authorization: Bearer YOUR_API_KEY" \
  https://api-eu-west-1.impossible.io/v1/publish/abc123-def456/ap-southeast-1
i Note

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 -H "Authorization: Bearer YOUR_API_KEY" \
  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 -H "Authorization: Bearer YOUR_API_KEY" \
  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 -H "Authorization: Bearer YOUR_API_KEY" \
  --data-binary @logo.png \
  https://api-eu-west-1.impossible.io/v1/data/abc123-def456/logo.png
i Note

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 -H "Authorization: Bearer YOUR_API_KEY" \
  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 -H "Authorization: Bearer YOUR_API_KEY" \
  "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 -H "Authorization: Bearer YOUR_API_KEY" \
  --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 -H "Authorization: Bearer YOUR_API_KEY" \
  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:

MethodEndpointDescription
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 -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @welcome-video.json \
  https://api-eu-west-1.impossible.io/v1/sdl/abc123-def456/welcome-video
i Note

After creating or updating a dynamic movie, remember to publish the project for the changes to be available for rendering.


Error responses

StatusMeaning
200Success.
201Created. Resource was created or updated.
400Bad request. Check your request parameters.
401Unauthorized. Check your API Key.
403Forbidden. Your credentials don’t have access to this resource.
404Not found. Project, asset, or SDL name doesn’t exist.
409Conflict. Resource already exists (e.g. duplicate project name).
500Server error. Retry with exponential backoff.