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

Still
0.08 credits

Frame
free

Clip
4 credits

Cover frame
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.
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.
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"}}'| Input | Type | Notes |
|---|---|---|
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. |
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.
| Step | Kind | What it does | Credits |
|---|---|---|---|
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 |
z-image-turbo, which you can call directly today, and wan-2.2-i2v, which is coming soon.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.
| Output | Kind | What 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. |
url with your key and curl -L.frame is saved too and appears in that step's outputs, but it isn't one of the run's named outputs.cover asset id as start_frame to video.generate to continue the shot.Every workflow runs the same way: estimate, run, follow, collect.
POST / prices a run with your actual inputs and validates them the same way a run would.
POST / returns 202 with the run. Add webhook_url, retention_days or an Idempotency-Key header as needed.
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.
When the run completes, outputs holds every named output, keyed by name, and credits.actual holds what you paid.
# 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"doneGeneration 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.
| Step | Status | Credits |
|---|---|---|
still | completed | 0.08 |
frame | completed | free |
clip | completed | 4 |
cover | completed | free |
| Charged | 4.08 credits ($0.204) | |
| Step | Status | Credits |
|---|---|---|
still | completed | 0.08 |
frame | completed | free |
clip | failed | 0 |
cover | canceled | 0 |
| Charged | 0.08 credits ($0.004) | |
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
Resize, extract frame and the other processing steps are free.
Free
Steps that failed or never ran cost nothing. Steps that completed before a failure or cancel stay charged.
Pay for what finished
canceled and releases the hold of any job still in flight.Starting a run is validated up front. Once it's going, a failed step stops the run and says which step it was.
| Status | Code | When |
|---|---|---|
| 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. |
job.canceled_by_workflow and the run's status becomes failed.error_code is the failing step's code, such as job.capacity_unavailable. Branch on it rather than on the error text.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.
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.
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.
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.
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"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.
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.
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.
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.
Yes. Every generation step is an ordinary job with source: "workflow". Its request_id works with the job status endpoint.
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.
Request early access. We’ll email you when your account is approved, with 200 free credits to spend in the first 30 days.