Windpaint
Commands

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
FlagDescription
-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.

FlagDescription
-o, --output <path>File or directory to save to.
--forceOverwrite existing files.

Files are named like this:

-o valueSaved as
None./<asset-id>.<ext>
A directory: existing, or ending in /<dir>/<asset-id>.<ext>. A new directory is created.
A file path, one assetExactly 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.

Next