Skip to Content

Uploading Videos

Uploading videos is done by sending a PUT request to the /videos/upload endpoint to create a new video object. You will get a response containing a signed S3URL to upload the video file to.

Creating a video requires the videos.create permission. Setting visibility to public also requires videos.publish. Without publish, the video is created as private. See Authentication.

Create video object

curl -X PUT https://app.ignitevideo.cloud/api/videos/upload \ -H "Authorization: Bearer YOUR_TOKEN" \ -H "Content-Type: application/json" \ -d '{"title": "Your video title", "visibility": "private" | "public"}'

If you have a video with spoken text content and want to start the AI auto transcription to start right after the video encoding, you can do so by setting two additional parameters when doing the PUT request to create the new video:

{ ..., "language": string, // "de-DE" | "..." locale of the spoken language "autoTranscribe": true }

Response

{ "videoId": "[VIDEO_ID]", "title": "Your video title", "signedUrl": "[SIGNED_URL]", }

Upload video file

Upload your video file as a PUT request to the signed URL returned in the previous step. You have to pass the mime type of the file as Content-Type header. You can get the mime type from your local video file via the file input element.

For large files (over 100MB), we recommend using multipart upload instead, which provides better reliability and supports files up to 60GB. You can also use the Uppy library for a simpler implementation with automatic chunking and progress tracking.

curl -X PUT [SIGNED_URL] \ -H "Content-Type: [MIME_TYPE]" \ --data-binary "@[PATH_TO_VIDEO_FILE]"

Encoding process

After the video file has been uploaded, encoding starts. This can take a while, depending on the video size and encoding complexity.

Poll the encoding status with GET /api/videos/[VIDEO_ID] as described in get video. A poll interval of a few seconds is usually enough. While encoding runs, status is PROGRESSING and statusProgress is a percentage from 0 to 100.

Example fields while encoding:

{ "id": "[VIDEO_ID]", "status": "PROGRESSING", "statusProgress": 36, "errorCode": null, "errorMessage": null }

When encoding succeeds, status becomes COMPLETE, statusProgress is 100, and playback sources are available under src.

When encoding fails, status becomes ERROR. Use errorCode for programmatic handling and errorMessage as a human-readable fallback. See Encoding status for the full lifecycle, status values, and error codes.

You can also subscribe to video.updated webhooks instead of polling. Progress updates can fire often during encoding. See Webhooks.