ProductsServicesDocsPricingAboutContact Log in Sign up

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

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
! 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 -u YOUR_API_KEY:YOUR_API_SECRET \
  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 -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
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 -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:

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 -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
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 and Secret.
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.