Several steps. One call.

A workflow chains generation steps and free processing steps, like resizing an image or pulling a frame from a video, behind one request. Text to Clip is the first, and it's coming soon: its clip step needs a video model, and none is live yet.

  1. A small paper boat floating on a rain puddle on a cobblestone street, reflections of the sky, close-up

    Stillimage.generateZ-Image Turbo1k tier

    0.08 credits

  2. The same still, resized for the video model

    Frameimage.resizesized for the video model

    free

  3. Illustrative clip: a slow push-in on the same still, not a video model output

    Clipvideo.generateWan 2.2 image-to-video5 s, 480p, coming soonillustrative stand-in

    4 credits

  4. Illustrative cover frame: a crop of the same still

    Cover framevideo.extract_framelast frame, PNGillustrative stand-in

    free

4.08 credits ($0.204) per run, coming soon

Illustrated with one real output, “A small paper boat floating on a rain puddle on a cobblestone street, reflections of the sky, close-up” (Z-Image Turbo, seed 11), not with a Text to Clip run. The clip is our own push-in on that still and the cover is a crop of it: neither is a video model output.

Text to Clip
Coming soon
Price per run
4.08 credits ($0.204), coming soon
Processing steps
Free
Outputs
Saved as assets

An idea in, three files out.

Describe a moment. Get a still of the scene, a clip that animates it, and a cover frame from the end of the clip. It is the image-then-video flow in a single request. It reports available: false until a video model is live.

Start a runbash
curl https://api.windpaint.ai/v1/workflows/text-to-clip/runs \  -H "Authorization: Bearer $WINDPAINT_API_KEY" \  -H "Content-Type: application/json" \  -d '{"inputs": {"idea": "a paper boat drifting down a rainy street", "aspect": "9:16"}}'
Inputs
InputTypeNotes
idea
text
Required. The scene and what moves in it. Used as the prompt for both the still and the motion.
aspect
choice
16:9 (default) or 9:16. Every output uses it; both cost the same.

Generation, asset, variant.

Each step uses the previous step's output. Two steps generate and are billed; two process and are free. Most of the time is the clip.

Text to Clip steps. A run will cost 4.08 credits ($0.204); coming soon.
StepKindWhat it doesCredits
still
image.generate with z-image-turbo
Generates the scene from your idea as a cinematic still at the 1k tier, in your aspect ratio.
0.08
frame
image.resize op
Crops and resizes the still to the size the video model expects.
free
clip
video.generate with wan-2.2-i2v (coming soon)
Animates the resized still into a 5 second, 480p clip, using your idea as the motion prompt.
4 (coming soon)
cover
video.extract_frame op
Takes the last frame of the clip as a PNG.
free
  • A run uses z-image-turbo, which you can call directly today, and wan-2.2-i2v, which is coming soon.

Every file is an asset.

The run returns each named output as a list of assets, ready to download, serve with a signed URL or pass into the next job.

Text to Clip outputs
OutputKindWhat it is
video
video (MP4)
The 5 second, 480p clip.
still
image
The generated still, before resizing.
cover
image (PNG)
The clip's last frame, for a thumbnail or the start of a follow-up clip.
  • All three are saved as assets in the run's project, with the same shape as a job's outputs. Download them through their url with your key and curl -L.
  • The resized frame is saved too and appears in that step's outputs, but it isn't one of the run's named outputs.
  • Pass the cover asset id as start_frame to video.generate to continue the shot.

Estimate. Run. Follow. Collect.

Every workflow runs the same way: estimate, run, follow, collect.

  1. Estimate.

    POST /v1/workflows/{slug}/estimate prices a run with your actual inputs and validates them the same way a run would.

  2. Run.

    POST /v1/workflows/{slug}/runs returns 202 with the run. Add webhook_url, retention_days or an Idempotency-Key header as needed.

  3. Follow.

    Poll the run's status_url, take a signed webhook when it starts or finishes, or open its event stream. Each step reports its status, progress and outputs as it goes.

  4. Collect.

    When the run completes, outputs holds every named output, keyed by name, and credits.actual holds what you paid.

Start, poll, downloadbash
# Start the run and keep its idrun_id=$(curl -s https://api.windpaint.ai/v1/workflows/text-to-clip/runs \  -H "Authorization: Bearer $WINDPAINT_API_KEY" \  -H "Content-Type: application/json" \  -d '{"inputs": {"idea": "steam rising from a coffee cup on a windowsill at sunrise", "aspect": "16:9"}}' \  | jq -r '.data.id')# Poll every 10 seconds until the run is terminalwhile :; do  run=$(curl -s "https://api.windpaint.ai/v1/workflows/runs/$run_id" \    -H "Authorization: Bearer $WINDPAINT_API_KEY")  status=$(echo "$run" | jq -r '.data.status')  echo "$status"  case "$status" in completed|failed|canceled) break ;; esac  sleep 10done# Download each output (follow the redirect to the signed URL)for name in video still cover; do  url=$(echo "$run" | jq -r ".data.outputs.$name[0].url")  ext=$(echo "$run" | jq -r ".data.outputs.$name[0].content_type" | cut -d/ -f2)  curl -sL "$url" -H "Authorization: Bearer $WINDPAINT_API_KEY" -o "$name.$ext"done

Pay for the steps that finish.

Generation steps cost what they would on their own. If the clip fails in Text to Clip, you pay 0.08 credits for the still and nothing for the clip. Shown at planned prices; Text to Clip is coming soon.

Every step completes
StepStatusCredits
stillcompleted0.08
framecompletedfree
clipcompleted4
covercompletedfree
Charged4.08 credits ($0.204)
The clip fails
StepStatusCredits
stillcompleted0.08
framecompletedfree
clipfailed0
covercanceled0
Charged0.08 credits ($0.004)

Generation steps

Charged when they complete, at the same price as running the job yourself. Each step holds its own credits when it starts.

Same as a single job

Op steps

Resize, extract frame and the other processing steps are free.

Free

Failures

Steps that failed or never ran cost nothing. Steps that completed before a failure or cancel stay charged.

Pay for what finished

  • Starting a run checks your available balance against the whole estimate but doesn't reserve it, so a run can fail partway if other jobs spend the balance in the meantime.
  • Canceling marks the run and its unfinished steps canceled and releases the hold of any job still in flight.

When a run can't start, or stops.

Starting a run is validated up front. Once it's going, a failed step stops the run and says which step it was.

Errors when starting a run
StatusCodeWhen
402
billing.insufficient_credits
Your available balance is below the run's estimate.
404
request.not_found
No workflow with that slug.
422
request.validation_failed
Unknown input, missing required input, or a value of the wrong type.
422
generation.asset_gone
An input asset has expired or been deleted.
429
rate_limit.requests
A run start counts as one submit against your rate limit.
429
rate_limit.concurrency
Your organization is at its concurrent job limit.
503
request.service_unavailable
The workflow can't run right now. details.reasons lists why.
  • If a step fails, the run stops: unfinished steps are canceled with job.canceled_by_workflow and the run's status becomes failed.
  • The run's error_code is the failing step's code, such as job.capacity_unavailable. Branch on it rather than on the error text.

Presets, versions, availability.

List the catalog to see every workflow, its inputs, its steps and whether it can run right now. You can't define your own workflows yet.

Presets

A workflow with some inputs already filled in, such as a fixed style or camera move. base names the workflow it's built on, and you only fill in what's left.

Versions

A workflow's version goes up when Windpaint changes it. Each run records the version it started with and finishes on it, even if the definition changes mid-run.

Availability

A workflow is available: false when a step has no live model yet. unavailable_reasons lists each blocked step, and starting a run returns 503.

List and inspectbash
curl "https://api.windpaint.ai/v1/workflows?category=video" \  -H "Authorization: Bearer $WINDPAINT_API_KEY"curl https://api.windpaint.ai/v1/workflows/text-to-clip \  -H "Authorization: Bearer $WINDPAINT_API_KEY"

Questions.

Which workflows can I run today?

None yet. Text to Clip, Photo to Clip and Product to Ad all depend on capabilities that don't have a live model yet, such as video.generate, so they report available: false and can't be started. They start working when those models ship, with no change on your side.

Can I build my own workflow?

Not yet. Workflows are defined by Windpaint. To build a custom pipeline, chain generation jobs yourself by passing one job's output asset id as the next job's input.

How much will a Text to Clip run cost?

4.08 credits ($0.204) at planned prices: 0.08 for the still and 4 for the clip. Text to Clip is coming soon, because its clip model, wan-2.2-i2v, isn't live yet. The resize and cover steps are free, and both aspect ratios cost the same.

What happens if a step fails?

The run stops, unfinished steps are canceled, and the run's error names the failing step. Steps that completed stay charged and their outputs stay in your project; failed steps cost nothing. If the clip fails in Text to Clip, you pay 0.08 credits for the still.

Are the steps normal generation jobs?

Yes. Every generation step is an ordinary job with source: "workflow". Its request_id works with the job status endpoint.

Are workflow presets the same as generation presets?

No. A workflow preset is a workflow with some inputs already filled in, such as a fixed style or camera move, and you run it like any workflow. Generation presets style a single image or video job.

Start yours.

Request early access. We’ll email you when your account is approved, with 200 free credits to spend in the first 30 days.