Asset commands
Command reference for upload, assets list and get, and download.
An asset is a file stored in your project: something you uploaded, or an output a job produced. Inputs to run are assets, and every output is one. See Assets.
windpaint upload ./frame.png
windpaint assets
windpaint download d41e8b0c-2a3f-4c5d-9e6f-7a8b9c0d1e2f -o clip.mp4
upload
windpaint upload ./frame.png
windpaint upload ./front.png ./side.png ./back.png
windpaint upload ./voice.wav --project launch-video --json | jq -r '.id'
Uploads one or more files to the selected project and prints the new assets. Use the ids as inputs:
id=$(windpaint upload ./frame.png --json | jq -r '.id')
windpaint run video.generate -p "slow dolly in" -i start_frame="$id" -o clip.mp4
ASSET KIND SOURCE TYPE DIMS SIZE FILENAME CREATED
8e1f4c2a-6b7d-4e3f-9a1c-2d5e8f0b7c64 image upload image/png 1280x720 412.3 KiB frame.png 2026-10-04 14:05
Supported types are PNG, JPEG, WebP, MP4, MP3 and WAV, up to 50 MiB each. Images must decode. Uploads are free. The content type comes from the file extension.
You rarely need upload on its own: run -i slot=./file and products run -i name=./file upload for you. Upload separately when you want to reuse one file across many runs without uploading it each time.
With --json, one file prints one asset object; several print an array. Files are uploaded in order, and the command stops at the first failure.
assets
windpaint assets
windpaint assets -n 200
windpaint assets --json | jq -r '.[] | select(.kind=="video") | .id'
Lists assets in the selected project, newest first: uploads and outputs together. assets list also works.
ASSET KIND SOURCE TYPE DIMS SIZE FILENAME CREATED
d41e8b0c-2a3f-4c5d-9e6f-7a8b9c0d1e2f video output video/mp4 5.0s 1.8 MiB - 2026-10-04 14:12
8e1f4c2a-6b7d-4e3f-9a1c-2d5e8f0b7c64 image upload image/png 1280x720 412.3 KiB frame.png 2026-10-04 14:05
| Flag | Description |
|---|---|
-n, --limit <n> | Maximum rows, 1–200. Default 50. |
KIND is image, mask, video, audio or text. SOURCE is upload or output.
assets get
windpaint assets get d41e8b0c-2a3f-4c5d-9e6f-7a8b9c0d1e2f
windpaint assets get https://api.windpaint.ai/v1/generation/assets/d41e8b0c-2a3f-4c5d-9e6f-7a8b9c0d1e2f/content
Shows one asset: kind, source, content type, dimensions, size, filename, the job that produced it, its project and its URL. Takes an asset id or any asset URL the API returned. You can read any asset in your organization, whatever project is selected.
download
windpaint download d41e8b0c-2a3f-4c5d-9e6f-7a8b9c0d1e2f
windpaint download d41e8b0c-2a3f-4c5d-9e6f-7a8b9c0d1e2f -o clip.mp4
windpaint download $(windpaint assets --json | jq -r '.[].id') -o ./all/
Downloads one or more assets by id or URL. assets download is the same command.
| Flag | Description |
|---|---|
-o, --output <path> | File or directory to save to. |
--force | Overwrite existing files. |
Files are named like this:
-o value | Saved as |
|---|---|
| None | ./<asset-id>.<ext> |
A directory: existing, or ending in / | <dir>/<asset-id>.<ext>. A new directory is created. |
| A file path, one asset | Exactly that path |
| A file path, several assets | <name>-1.<ext>, <name>-2.<ext>, … in argument order |
The extension comes from the asset’s content type. An existing file is never overwritten without --force; the command exits with code 2 instead. Files are written to a temporary name and renamed when complete, so an interrupted download doesn’t leave a partial file under the final name.
ASSET TYPE SIZE PATH
d41e8b0c-2a3f-4c5d-9e6f-7a8b9c0d1e2f video/mp4 1.8 MiB /Users/you/clip.mp4
With --json, each saved file is {asset_id, path, content_type, size_bytes}: an object for one asset, an array for several.
Assets don’t expire, and there’s no command or endpoint to delete them today.