Wan 2.2 Fun Control API Documentation

Wan 2.2 Fun Control API Documentation

Playground

Try it on WaveSpeedAI!

Wan2.2-Fun-Control uses Control Codes and multi-modal inputs to generate preset-controlled videos up to 120s at 720p; released under Apache 2.0 for commercial use. Ready-to-use REST API, no coldstarts, affordable.

Features

Wan2.2-Fun-Control is an advanced video generation and control model developed by the PAI team, designed for precise and creative video synthesis. By integrating Control Codes with deep learning and multi-modal conditioning, it enables users to direct motion, structure, and scene composition โ€” achieving controllable, high-fidelity video generation under customizable guidance.


๐ŸŒŸ Key Features

  • ๐ŸŽ›๏ธ Multi-Modal Control Supports multiple input types for fine-grained video control:

  • Canny: Edge or line-art guidance

  • Depth: Depth map-based spatial control

  • OpenPose: Human pose and skeletal motion tracking

  • MLSD: Geometric line structure for scene layout

  • Trajectory Control: Object or camera movement path conditioning

  • ๐ŸŽฌ High-Quality Video Generation Built on the Wan 2.2 architecture โ€” delivering cinematic, high-resolution video outputs with stable motion and consistent identity.

  • ๐ŸŒ Multi-Language Prompting Accepts both Chinese and English descriptions for flexible creative control.

  • ๐Ÿง  Intelligent Composition Aligns user-provided references (images or frames) with pose, structure, and scene layout to ensure natural transitions and realism.


๐Ÿ’ฐ Pricing

ResolutionCost per 5 SecondsMax Duration
480p$0.20120 seconds
720p$0.40120 seconds

Billing Rules

  • Standard Rate: $0.04 per second
  • HD (720p) Rate: $0.08 per second
  • Minimum Charge: All audio is billed for a minimum of 5 seconds.
  • Standard: $0.20
  • HD (720p): $0.40
  • Billing Cap: To keep your costs predictable, billing is capped at a maximum of 600 seconds (10 minutes).

โš™๏ธ Usage Tips

  • ๐Ÿง Keep reference consistency: The reference imageโ€™s composition, pose, and camera angle should match the desired video framing. Major mismatches between input and control maps (e.g., OpenPose or Canny) can lead to generation instability or artifacts.

  • ๐Ÿ–ผ๏ธ Match aspect ratios: The aspect ratio of the input image and target video should remain identical for best results.

  • ๐Ÿ”„ Control balance: Combining too many control types simultaneously may reduce creative flexibility โ€” start with one or two controls and tune gradually.

Authentication

For authentication details, please refer to the Authentication Guide.

API Endpoints

Submit Task & Query Result

set -euo pipefail

export WAVESPEED_API_KEY="your-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",
  "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/wan-2.2/fun-control" \
  -H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
  -H "Content-Type: application/json" \
  -d "${REQUEST_BODY}")

TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; 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 type == "object" and has("data") then .data else . end')
  STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')

  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

Parameters

Task Submission Parameters

Request Parameters

ParameterTypeRequiredDefaultRangeDescription
imagestringYes-The image for generating the output.
videostringYes-The video for generating the output.
promptstringNo-The positive prompt for the generation.
resolutionstringNo480p480p, 720pThe resolution of the output video.
seedintegerNo-1-The random seed to use for the generation. -1 means a random seed will be used.

Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., โ€œsuccessโ€)
data.idstringUnique identifier for the prediction, Task Id
data.modelstringModel ID used for the prediction
data.outputsarrayOutput values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed)
data.urlsobjectObject containing related API endpoints
data.urls.getstringURL to retrieve the prediction result
data.statusstringStatus of the task: created, processing, completed, or failed
data.created_atstringISO timestamp of when the request was created (e.g., โ€œ2023-04-01T12:34:56.789Zโ€)
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds

Result Request Parameters

ParameterTypeRequiredDefaultDescription
idstringYes-Task ID

Result Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., โ€œsuccessโ€)
dataobjectThe prediction data object containing all details
data.idstringUnique identifier for the prediction
data.modelstringModel ID used for the prediction
data.outputsarray<string | object>Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model.
data.urlsobjectObject containing related API endpoints
data.urls.getstringURL to poll for the prediction result
data.statusstringStatus: created, processing, completed, or failed
data.created_atstringISO timestamp of when the request was created
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds
ยฉ 2026 WaveSpeedAI. All rights reserved.