Seedream 5.0 Pro sudah LIVE | Coba di Generator Gambar →

SCAIL-2 Character Animation API

wavespeed-ai /

SCAIL-2 is a fast AI character animation and subject replacement model that preserves identity and motion from a single reference image and a driving video. It supports both Animation mode and Replacement mode at 480p or 720p. Ready-to-use REST inference API for character animation, motion transfer, subject replacement, social media clips, creative video editing, and professional image-to-video workflows with simple integration, no coldstarts, and affordable pricing.

motion-control
Input

Siap

$0.2per run·~50 / $10

ContohLihat semua

Model Terkait

README

SCAIL-2 — End-to-End Character Animation

SCAIL-2 generates character animation from a single reference image and a driving video. Upload a character image, provide a driving video, choose a generation mode, and create an animated or replacement-style video result.

SCAIL-2 supports two modes:

  • Animation Mode — animate the reference character using the driving video's motion.
  • Replacement Mode — replace the driving video's subject with the reference character while preserving the original scene.

Key Features

  • Image-to-video character animation Animate a reference character image using motion from an input driving video.

  • Subject replacement Swap the subject in the driving video with the reference character while preserving the original scene structure.

  • Two generation modes Use animate for motion-driven character animation or replace for subject replacement.

  • Long-video support Supports input video duration up to 120 seconds for billing calculation.

  • Audio passthrough The driving video's audio track is preserved in the output.

Parameters

ParameterRequiredDescription
imageYesReference character image. JPG or PNG is recommended; avoid WEBP.
videoYesDriving video that provides the motion.
promptNoOptional positive prompt describing the desired output. Default: empty string.
modeNoGeneration mode: animate or replace. Default: animate.
resolutionNoOutput resolution tier: 480p or 720p. Default: 480p.
seedNoRandom seed. Use -1 for a random seed. Default: -1.

How to Use

  1. Upload image — Provide a clear reference image of the character. JPG or PNG is recommended.
  2. Upload video — Provide the driving video that contains the motion.
  3. Add prompt (optional) — Describe the desired output, such as style, character details, or scene quality.
  4. Choose mode — Select animate to animate the reference character, or replace to swap the video subject with the reference character.
  5. Select resolution — Choose 480p for the default output or 720p for higher resolution.
  6. Generate — Create the final video result.

Pricing

ResolutionPrice per 5 sPrice per secondMax billed duration
480p$0.20$0.04 / s120 s
720p$0.40$0.08 / s120 s

Billing Rules

  • Minimum charge: 5 seconds. Any video shorter than 5 seconds is billed as 5 seconds.
  • Maximum billed duration: 120 seconds.
  • 720p costs 2x the 480p price.
  • Billing is based on the input video duration after applying the 5-second minimum and 120-second maximum cap.

Best Use Cases

  • Character animation — Animate a reference character using motion from a driving video.
  • Dance and gesture transfer — Transfer body movement, gestures, and performance motion to a reference character.
  • Subject replacement — Replace the main subject in a video with a reference character.
  • Avatar content creation — Generate character videos for social media, entertainment, and creative projects.
  • Video variation — Recreate the same motion with different character references.

Pro Tips

  • Use a clear reference image with the character visible.
  • JPG or PNG is recommended; avoid WEBP.
  • Use a driving video with a clearly visible main subject.
  • Keep the reference image's camera angle close to the driving video's framing when possible.
  • Use animate when you want to drive the reference character with the video motion.
  • Use replace when you want to swap the video subject with the reference character.
  • Use 480p for testing and 720p for higher-resolution output.
  • Add a prompt when you want more control over the style or visual details.

Notes

  • image and video are required fields.
  • prompt, mode, resolution, and seed are optional.
  • Default mode is animate.
  • Default resolution is 480p.
  • Default seed is -1, which uses a random seed.
  • Minimum billing duration is 5 seconds.
  • Maximum billed duration is 120 seconds.
  • Ensure uploaded image and video URLs are publicly accessible.
Catatan:Situs web ini menggunakan model AI yang disediakan oleh pihak ketiga.

Scail 2 API — Quick start

Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/wavespeed-ai/scail-2 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 Scail 2 below.

HTTP example
set -euo pipefail

: "${WAVESPEED_API_KEY:?Set WAVESPEED_API_KEY}"

REQUEST_BODY=$(cat <<'JSON'
{
    "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
    "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
    "mode": "animate",
    "resolution": "480p",
    "seed": -1
}
JSON
)

# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  -X POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/scail-2" \
  -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
done
Node.js example
const submitUrl = "https://api.wavespeed.ai/api/v3/wavespeed-ai/scail-2";
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({
        "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
        "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
        "mode": "animate",
        "resolution": "480p",
        "seed": -1
}),
});
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));
}
Python example
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 = {
    "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
    "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
    "mode": "animate",
    "resolution": "480p",
    "seed": -1
}

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/wavespeed-ai/scail-2", 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)

Scail 2 API — Frequently asked questions

What is the Scail 2 API?

Scail 2 is a WaveSpeedAI model for pose / motion driven video, exposed as a REST API on WaveSpeedAI. SCAIL-2 is a fast AI character animation and subject replacement model that preserves identity and motion from a single reference image and a driving video. It supports both Animation mode and Replacement mode at 480p or 720p. Ready-to-use REST inference API for character animation, motion transfer, subject replacement, social media clips, creative video editing, and professional image-to-video workflows with simple integration, no coldstarts, and affordable pricing. You can call it programmatically or try it from the playground above.

How do I call the Scail 2 API?

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/wavespeed-ai/scail-2.

How much does Scail 2 cost per run?

Scail 2 starts at $0.20 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.

What inputs does Scail 2 accept?

Key inputs: `prompt`, `image`, `video`, `resolution`, `seed`, `mode`. 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/wavespeed-ai/scail-2.

How long does Scail 2 take to generate?

Median end-to-end generation time on WaveSpeedAI is around 210 seconds per request, based on recent successful runs. Queue time varies with global demand; live status is visible in the prediction record.

Can I use Scail 2 outputs commercially?

Commercial usage rights depend on the model's license, set by its provider (WaveSpeedAI). The license summary appears on the model card above; see WaveSpeedAI's Terms of Service for platform-level conditions.