Waver 1.0 is an all-in-one model for text-to-video, image-to-video, and text-to-image generation. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Ожидание
$0.3за запуск·~33 / $10
Anamorphic ultra-wide shot of a colossal, lone explorer-class starship gliding silently through the upper atmosphere of a storm-wracked gas giant. Volumetric clouds swirl below, occasionally illuminated by massive lightning flashes, casting dynamic, dramatic shadows across the ship's hull. Faint lens flares streak across the frame.
A young woman sits on a sun-drenched park bench, eyes closed and a blissful smile on her face, completely lost in the music from her headphones. Autumn leaves gently fall around her.
A person wrapped in a warm blanket, looking up at a vast, star-filled night sky from an open field. A look of pure awe and wonder is on their face, illuminated by the soft moonlight.
A young female artist with a few paint splatters on her overalls, in a bright, sun-drenched loft studio. She is completely in her element, smiling subtly with intense focus as she adds a bold yellow brushstroke to a large, abstract canvas. The camera slowly pushes in on her face.
Ultra realistic young woman, casual outfit, sitting on a cafe terrace, sipping coffee, soft morning sunlight, slight breeze moving hair, camera slowly dolly in, natural background chatter, cinematic atmosphere
Handheld tracking shot, eye-level, following a desperate man sprinting through a debris-strewn, chaotic city street. Just behind him, a massive fireball from an explosion erupts in extreme slow motion, sending a shockwave of dust and embers washing over him. The air is thick with smoke and particle effects.
A young girl with short brown hair and large, curious eyes lies on her back in a field of impossibly tall, sun-drenched grass. She holds a single, glowing dandelion seed, watching it with a look of pure wonder as it begins to float away into a brilliant blue sky with soft, puffy clouds.
A charming and slightly clumsy inventor made of plasticine clay, in the style of Aardman Animations. He wears tiny, wire-rimmed glasses and a knitted wool vest. Visible fingerprints can be seen on his face, giving him a tactile, handmade quality. He looks proudly at his comically oversized, clunky invention. The scene is shot with the characteristic lighting of stop-motion animation.
Women move forward.
Waver 1.0 is a powerful image-to-video generation model that transforms static images into dynamic, cinematic videos. Simply provide an image and describe the motion you want — the model brings your visual to life with smooth, high-quality animation.
| Parameter | Required | Description |
|---|---|---|
| image | Yes | Source image (upload or public URL). |
| prompt | Yes | Text description of desired motion, camera, and style. |
| seed | No | Set for reproducibility; leave empty for random. |
| Output | Price |
|---|---|
| Per video | $0.30 |
Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/bytedance/waver-1.0 with your input as JSON. The endpoint returns a prediction id. Start polling the result endpoint around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. On completed, read output values from data.outputs. Examples for Waver 1.0 below.
set -euo pipefail
: "${WAVESPEED_API_KEY:?Set WAVESPEED_API_KEY}"
REQUEST_BODY=$(cat <<'JSON'
{
"prompt": "A cinematic shot of a city at sunset, soft golden light",
"image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
}
JSON
)
# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
-X POST "https://api.wavespeed.ai/api/v3/bytedance/waver-1.0" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $WAVESPEED_API_KEY" \
-d "$REQUEST_BODY")
TASK=$(printf '%s' "$SUBMIT_RESPONSE" | jq 'if has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "$TASK" | jq -r '.id')
if [ -z "$PREDICTION_ID" ] || [ "$PREDICTION_ID" = "null" ]; then
printf 'Submission response did not contain a prediction id
' >&2
exit 1
fi
RESULT_URL=$(printf '%s' "$TASK" | jq -r '.urls.get // empty')
if [ -z "$RESULT_URL" ]; then
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/$PREDICTION_ID/result"
fi
# 2. Poll until the prediction finishes.
while true; do
RESPONSE=$(curl --silent --show-error --fail-with-body "$RESULT_URL" \
-H "Authorization: Bearer $WAVESPEED_API_KEY")
RESULT=$(printf '%s' "$RESPONSE" | jq 'if has("data") then .data else . end')
STATUS=$(printf '%s' "$RESULT" | jq -r '.status')
case "$STATUS" in
completed) printf '%s\n' "$RESULT" | jq '.outputs'; break ;;
failed|cancelled|timeout) printf '%s\n' "$RESULT" | jq . >&2; exit 1 ;;
created|processing) sleep 2 ;;
*) printf 'Unexpected status: %s
' "$STATUS" >&2; exit 1 ;;
esac
doneconst submitUrl = "https://api.wavespeed.ai/api/v3/bytedance/waver-1.0";
const apiKey = process.env.WAVESPEED_API_KEY;
if (!apiKey) throw new Error('Set WAVESPEED_API_KEY');
async function requestJson(url, options = {}) {
const response = await fetch(url, options);
if (!response.ok) throw new Error(await response.text());
return response.json();
}
// 1. Submit the prediction.
const body = await requestJson(submitUrl, {
method: "POST",
headers: {
"Authorization": `Bearer ${apiKey}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"prompt": "A cinematic shot of a city at sunset, soft golden light",
"image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
}),
});
const task = body.data ?? body;
if (!task.id) throw new Error("Submission response did not contain a prediction id");
const resultUrl = task.urls?.get ||
`https://api.wavespeed.ai/api/v3/predictions/${task.id}/result`;
// 2. Poll until the prediction finishes.
while (true) {
const resultBody = await requestJson(resultUrl, {
headers: { "Authorization": `Bearer ${apiKey}` },
});
const result = resultBody.data ?? resultBody;
if (result.status === "completed") {
console.log(result.outputs);
break;
}
if (["failed", "cancelled", "timeout"].includes(result.status)) throw new Error(JSON.stringify(result));
if (!["created", "processing"].includes(result.status)) throw new Error("Unexpected status: " + result.status);
await new Promise(resolve => setTimeout(resolve, 2000));
}import json
import os
import time
from urllib.request import Request, urlopen
api_key = os.environ["WAVESPEED_API_KEY"]
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
payload = {
"prompt": "A cinematic shot of a city at sunset, soft golden light",
"image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
}
def request_json(url, data=None):
request = Request(url, data=data, headers=headers, method="POST" if data else "GET")
with urlopen(request) as response:
return json.load(response)
# 1. Submit the prediction.
body = request_json("https://api.wavespeed.ai/api/v3/bytedance/waver-1.0", json.dumps(payload).encode())
task = body.get("data", body)
if not task.get("id"):
raise RuntimeError("Submission response did not contain a prediction id")
result_url = task.get("urls", {}).get("get") or f"https://api.wavespeed.ai/api/v3/predictions/{task['id']}/result"
# 2. Poll until the prediction finishes.
while True:
result_body = request_json(result_url)
result = result_body.get("data", result_body)
status = result.get("status")
if status == "completed":
print(result.get("outputs", []))
break
if status in {"failed", "cancelled", "timeout"}:
raise RuntimeError(result)
if status not in {"created", "processing"}:
raise RuntimeError(f"Unexpected status: {status}")
time.sleep(2)Waver 1.0 is a ByteDance model for video generation from images, exposed as a REST API on WaveSpeedAI. Waver 1.0 is an all-in-one model for text-to-video, image-to-video, and text-to-image generation. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing. You can call it programmatically or try it from the playground above.
POST your input parameters to the model's REST endpoint (shown in the API tab of this playground) with your WaveSpeedAI API key in the Authorization header. Submission returns a prediction ID. Poll the result endpoint starting around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. The playground generates production-oriented Python, JavaScript, and cURL examples with timeouts, transient-error handling, and safe GET retries. Full request/response shape is documented at https://wavespeed.ai/docs/docs-api/bytedance/bytedance-waver-1.0.
Waver 1.0 starts at $0.30 per run. That figure is the base price — the final charge scales with the parameters you set in the form (output size, length, count, references, or whatever knobs this model exposes), so a higher-quality or larger output costs more than a minimal one. The exact cost for your current input is shown live next to the Generate button before you submit, and the actual per-call charge is recorded on the prediction afterwards.
Key inputs: `prompt`, `image`, `seed`. The full JSON schema (types, defaults, allowed values) is rendered above the Generate button and mirrored in the API reference at https://wavespeed.ai/docs/docs-api/bytedance/bytedance-waver-1.0.
Median end-to-end generation time on WaveSpeedAI is around 132 seconds per request, based on recent successful runs. Queue time varies with global demand; live status is visible in the prediction record.
Commercial usage rights depend on the model's license, set by its provider (ByteDance). The license summary appears on the model card above; see WaveSpeedAI's Terms of Service for platform-level conditions.