Overview

vimeoId metatag, so running the import again skips videos that are already imported.
Scope
The import copies the video files, their titles, descriptions, and tags, and your folder structure. Settings that control who can watch your videos and where stay on Vimeo, so plan to set up their Bunny equivalents.Prerequisites
- A bunny.net account
- A Vimeo account on a plan that allows video file access: Standard, Advanced, or Enterprise, or a legacy Plus, Pro, Business, or Premium plan. Free and Starter plans cannot download video files through the API.
Migrate your videos
1
Install and authenticate the Bunny CLI
Install the Bunny CLI with the shell installer or npm:The installer downloads a prebuilt binary for your platform and places it on your See Installation for more options. Then authenticate the CLI with your bunny.net account:
- curl
- npm
PATH.bunny login opens your browser to complete authentication and stores the credentials locally. The first time you log in from an interactive terminal, it also offers to install the agent skill for AI coding tools. On a remote machine or in CI without a browser, run bunny login --api-key "$BUNNYNET_API_KEY" instead, with a key from Account Settings > API key.2
Create a Bunny Stream library
Create a library for the imported videos, or skip this step to use an existing one:DE is always the main storage region. Replicate to the regions closest to your audience, from When the CLI asks how to add videos, choose Later. You start the import in the next steps.Copy the library ID from the output. You pass it to
UK, SE, NY, LA, SG, SYD, BR, and JH. You can’t remove a replication region later.Set encoding options, such as
--resolutions or --encoding-tier, when you create the library. Changes you make later apply only to new uploads, not to videos that are already imported. Run bunny stream libraries create --help to see every option, or read Encoding.--library in the import commands. The flag also accepts the library’s name, and --lib works as a short alias.3
Create a Vimeo access token
The Bunny CLI needs a Vimeo personal access token with these scopes:
On the app’s page, select Generate Access Token under Authentication in the left-hand navigation:
Choose Authenticated (you), so the token can read the private videos on your account. Under Scopes, Public is already checked, so also check Private and Video Files. Click Generate.
The new token appears under Personal Access Tokens with the scopes private, video_files, and public. Copy the value from the Token column.
- Public and Private: to read every video on your account, including private and unlisted ones
- Video Files: to read the download links for each video




4
Preview the migration with a dry run
Run the import with Once Vimeo accepts the token, the CLI offers to save it so later runs skip this prompt. Press Enter to accept:
The dry run then prints a summary and the import plan:Already imported counts videos that are already in the library, and To import counts the ones a real run would import. The size comes from Vimeo’s download links, so if the summary has no Size row, check that your plan allows video file access and that the token has the Video Files scope.The plan groups videos by the collection they will land in. Each Vimeo folder maps to a collection of the same name, and videos outside any folder are listed under (no collection).Bunny Stream accepts sources up to 2160p (3840x2160, or 2160x3840 in portrait) and up to 72 hours long, while Vimeo hosts videos up to 8K. The dry run warns about any video beyond those limits, as it will fail on Bunny:
--dry-run, using the library ID from step 2:--dry-run prints the import plan without making any changes to either platform.The CLI then prompts for your Vimeo access token. Paste it at the Access Token prompt:Where the CLI stores credentials
Where the CLI stores credentials
The CLI stores saved credentials in
~/.config/bunnynet/stream-import-credentials.json (or under $XDG_CONFIG_HOME/bunnynet/ when it is set). Only your user account can read the file, and it is separate from the main Bunny CLI config. Saved credentials belong to the active Bunny CLI profile. If Vimeo later rejects them, for example after you revoke the token, the CLI deletes them and prompts again on the next run. If you answer no, the CLI prompts on every run.The VIMEO_ACCESS_TOKEN environment variable always takes priority over a saved token.5
Run the import
Run the same command without The CLI prints the same summary, then asks for confirmation. Type The CLI creates a collection for each folder, skips videos that are already imported, hands the rest to Bunny three at a time, and tags each video with Collection names match without regard to case, so Vimeo folders named Preview a folder’s videos with The import works the same way, limited to that folder’s videos and its collection.
--dry-run:y and press Enter to start:vimeoId, along with its Vimeo description and tags. It returns once every video is queued. Bunny then fetches each file directly from Vimeo and encodes it.Webinars and webinars land in one collection. Rename one of them in Vimeo before the import to keep them separate.The import command also accepts these flags:--waitkeeps the command running, with a live encoding progress indicator, until Bunny has encoded every video.--forceskips the confirmation prompt and the offer to retry failed videos, for unattended or CI runs.--concurrency Nsets how many videos the CLI passes to Bunny in parallel, from 1 to 20.--clean-faileddeletes the failed Bunny copies of videos before importing them again, including videos that Bunny rejected.--retry-stalleddeletes and imports again any video stuck at zero bytes on Bunny.--request-timeoutsets how many seconds one request to Vimeo or Bunny can take before it gives up (default 30).--video-timeoutsets how many seconds the hand-off of one video to Bunny, or with--waitits encoding, can take before it gives up (default 5400).
bunny stream import --help for the full list.To migrate a large account one folder at a time, list the folders and their IDs:--folder, then pass the same ID to the import:6
Watch encoding progress
The import returns before Bunny finishes encoding. Check progress with the status command:It prints one row per queued video, with its status on Bunny, encode percentage, size, and when it was queued:Run it again until the last line reports 0 processing. The command exits with a non-zero code when any video has failed, so you can also use it as a check in scripts.
7
Verify in the bunny.net dashboard
Open the bunny.net dashboard and go to Stream > Your library > Manage library. Each Vimeo folder appears as a collection, and every migrated video is listed under Latest videos.
Set up the library’s security settings if you have not already, then replace the Vimeo embeds (player.vimeo.com iframes) and links in your site with their Bunny Stream equivalents. See Embedding videos for the embed and player options.

Troubleshooting
Some videos failed during the import
Some videos failed during the import
When videos fail during an interactive import, the CLI lists each failure and offers to retry them:Answer
y to retry them in the same run. If the import was interrupted, or you declined the retry, run it again with --resume:--resume retries failed videos, processes any that were still outstanding, and re-applies the vimeoId tag to videos Bunny fetched before the run stopped. When the interrupted run was limited to one folder, the resume continues that folder. It stops retrying a video after three failed attempts and skips videos that Bunny rejected. To retry those too, add --clean-failed, which deletes their Bunny copies first.Running the import again is always safe. Videos that already carry the vimeoId tag are skipped, and the CLI reports Everything is already imported once nothing is left.No download available
No download available
Vimeo returned no downloadable file for that video. This happens when your Vimeo plan does not allow video file access, when the token is missing the Video Files scope, or when the video was deleted from Vimeo after the import started.
Invalid Vimeo access token
Invalid Vimeo access token
Videos are stuck with no data
Videos are stuck with no data
If
bunny stream import status reports videos stuck at zero bytes, run the import again with --retry-stalled to delete and fetch them again.