Migrate from another platform¶
Moving a library to HeapStream is a two-step process: get a downloadable URL for each source file from your current provider, then hand those URLs to fetch video — HeapStream downloads and encodes each one in the background, so you never route the files through your own machines.
curl -u "<apikey_id>:<apikey_password>" \
-H "Content-Type: application/json" \
-d '{ "url": "<source_file_url>", "metadata": { "title": "<title>" } }' \
https://staging.heapstream.com/api/v1/project/<project_id>/video/fetch
Loop that over your export list. Fetches run asynchronously and in parallel; track completion with a webhook rather than polling. Uploads count against your storage quota as they land, and files up to 20 GB each are accepted (see Limits).
Getting source URLs from your current provider¶
Enable static renditions (or master access) on your assets to get downloadable MP4 URLs, then fetch each one. See Mux's documentation ⧉ for enabling downloads on existing assets.
On paid plans, Vimeo exposes download links for your source files — per video on the site, or in bulk via the API's file links. See Vimeo's help center ⧉ for exporting your videos.
Enable MP4 Fallback on your Stream library to get direct MP4 URLs for each video, then fetch those. See Bunny's documentation ⧉ for details.
Any directly downloadable HTTP(S) URL works — a public file server, a pre-signed S3/GCS link, or your own origin. If you can curl -O it, the fetch endpoint can ingest it.
What carries over, and what to re-create¶
| From the source platform | On HeapStream |
|---|---|
| The video file | Fetched and re-encoded into HeapStream's renditions. |
| Title | Pass it as metadata.title on the fetch. |
| Privacy | Pass metadata.public, and set a password or signed URLs after. |
| Captions/subtitles | Export the VTT/SRT files and upload them as text tracks — or regenerate with AI captions. |
| Thumbnails | Upload as posters, or let HeapStream pick representative frames automatically. |
| Chapters | Upload a chapters file, or generate them once captions exist. |
| View statistics | Not importable — analytics start fresh. |
After each video completes, update its remaining metadata (description, tags) with the edit video endpoint, and swap your embed codes for the HeapStream player.