API Crear clave

Alibaba CloudVideo

Wan 2.2 Animate

Hace que tu personaje copie el movimiento de un video (mover) o lo pone en lugar de la persona del video (reemplazar).

Precio
90 crpor clip · move · 480p · varía con la duración o el tamaño
Tiempo habitual
≈ 4 min
Id del modelo
video.wan-animate

Zona de pruebas

Zona de pruebas

Imagen *

Inicia sesión para subir un archivo.

Video *

Inicia sesión para subir un archivo.

Modo
Resolución
Regístrate para ejecutarlo

Cambia los ajustes: el precio y el código se actualizan. Para ejecutarlo necesitas una cuenta.

video.wan-animate
Calidad
480p, 580p, 720p
Modo
move, replace
Admite
Imagen, Video

Aún no hay un ejemplo de este modelo. Estos son sus ajustes reales.

# 0. Primero sube tu archivo y pon en params el id que imprime.
curl -s -X POST https://staglight.ai/api/v1/uploads \
  -H "Authorization: Bearer $STAGLIGHT_API_KEY" -F file=@your-file | jq -r .id

# 1. Crea el trabajo. Se cobra una vez y se reembolsa si falla.
JOB_ID=$(curl -s -X POST https://staglight.ai/api/v1/jobs \
  -H "Authorization: Bearer $STAGLIGHT_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "op": "video.wan-animate",
    "params": {
      "image": "med_your_upload_id",
      "video": "med_your_upload_id",
      "own_footage": true,
      "mode": "move",
      "resolution": "480p"
    }
  }' | jq -r .id)

# 2. Consulta hasta que termine. Cada llamada espera hasta 30 segundos.
while :; do
  JOB=$(curl -s "https://staglight.ai/api/v1/jobs/$JOB_ID?wait=30" -H "Authorization: Bearer $STAGLIGHT_API_KEY")
  case "$(echo "$JOB" | jq -r .status)" in queued|running) ;; *) break ;; esac
done

# 3. Descarga el resultado desde outputs[0].download_url.
DOWNLOAD_URL=$(echo "$JOB" | jq -r '.outputs[0].download_url')
curl -L -o result.mp4 "$DOWNLOAD_URL"
import os, uuid, requests

BASE = "https://staglight.ai/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['STAGLIGHT_API_KEY']}"}

# 0. Primero sube tu archivo y pon en params el id que imprime.
with open("your-file", "rb") as f:
    print(requests.post(f"{BASE}/uploads", headers=HEADERS, files={"file": f}, timeout=300).json()["id"])

# 1. Crea el trabajo. Se cobra una vez y se reembolsa si falla.
r = requests.post(f"{BASE}/jobs", timeout=60,
                  headers={**HEADERS, "Idempotency-Key": str(uuid.uuid4())},
                  json={
                    "op": "video.wan-animate",
                    "params": {
                      "image": "med_your_upload_id",
                      "video": "med_your_upload_id",
                      "own_footage": True,
                      "mode": "move",
                      "resolution": "480p"
                    }
                  })
r.raise_for_status()
job = r.json()

# 2. Consulta hasta que termine. Cada llamada espera hasta 30 segundos.
while job["status"] in ("queued", "running"):
    job = requests.get(f"{BASE}/jobs/{job['id']}", headers=HEADERS,
                       params={"wait": 30}, timeout=60).json()

# 3. Descarga el resultado desde outputs[0].download_url.
print(job["outputs"][0]["download_url"] if job["outputs"] else job["data"] or job["error"])
// Node 18 o posterior. Guárdalo como run.mjs: el await de nivel superior necesita un módulo.
const BASE = "https://staglight.ai/api/v1";
const headers = { Authorization: `Bearer ${process.env.STAGLIGHT_API_KEY}` };

// 0. Primero sube tu archivo y pon en params el id que imprime.
// const form = new FormData(); form.append('file', yourFile);
// const { id } = await (await fetch(`${BASE}/uploads`, { method: 'POST', headers, body: form })).json();

// 1. Crea el trabajo. Se cobra una vez y se reembolsa si falla.
let res = await fetch(`${BASE}/jobs`, {
  method: "POST",
  headers: { ...headers, "Content-Type": "application/json", "Idempotency-Key": crypto.randomUUID() },
  body: JSON.stringify({
    "op": "video.wan-animate",
    "params": {
      "image": "med_your_upload_id",
      "video": "med_your_upload_id",
      "own_footage": true,
      "mode": "move",
      "resolution": "480p"
    }
  }),
});
if (!res.ok) throw new Error((await res.json()).error.message);
let job = await res.json();

// 2. Consulta hasta que termine. Cada llamada espera hasta 30 segundos.
while (job.status === "queued" || job.status === "running") {
  job = await (await fetch(`${BASE}/jobs/${job.id}?wait=30`, { headers })).json();
}

// 3. Descarga el resultado desde outputs[0].download_url.
console.log(job.outputs[0]?.download_url ?? job.data ?? job.error);
{
  "id": "job_19a2b3c4d5e6f7a8b9c0d1",
  "op": "video.wan-animate",
  "status": "queued",
  "credits": 90,
  "title": "",
  "params": {
    "image": "med_your_upload_id",
    "video": "med_your_upload_id",
    "own_footage": true,
    "mode": "move",
    "resolution": "480p"
  },
  "progress": null,
  "outputs": [],
  "data": null,
  "error": null,
  "run_id": null,
  "source": "api",
  "created_at": "2026-11-06T12:00:00Z",
  "finished_at": null,
  "eta_seconds": 270
}

Cuánto cuesta

ResoluciónPrecio
480p90 cr
580p135 cr
720p180 cr

Estos precios son con una duración por defecto: el precio depende de la duración de tu texto o archivo, y el precio exacto aparece antes de ejecutar la tarea. La zona de pruebas muestra el precio exacto de tus ajustes. La tarea se cobra una vez al aceptarla y se reembolsa si falla. El precio se vuelve a comprobar con tu archivo antes de ejecutar.

Parámetros

NombreTipoPor defectoValores
imageobligatorioImagen media id Imagen
videoobligatorioVideo media id Video
own_footageobligatorioTengo derecho a usar este clip y estas imágenes boolean
modeModo enum move move, replace
resolutionResolución enum 480p 480p, 580p, 720p

Envíalos dentro de params. Los archivos son ids de POST /api/v1/uploads. Ver la documentación

Más modelos