Referencia de la API

Videos

POST/v1/videos
GET/v1/videos/{task_id}
GET/v1/videos/{task_id}/content

Generación de video asíncrona (Seedance, Kling, Veo, Wan, Grok Imagine …). /v1/videos acepta entradas de texto a video e imagen a video en una única solicitud con formato OpenAI. Devuelve un task_id que consultas — o registra un webhook al enviarla.

#Parámetros de la solicitud

  • modelstringobligatorio

    Un ID de modelo de video de la página de modelos, p. ej. doubao-seedance-2.5.

  • promptstringobligatorio

    Descripción de la escena; en image2video orienta el movimiento.

  • imagestringopcional

    Solo image2video: imagen del primer fotograma como URL o base64.

  • imagesarrayopcional

    Fotogramas de referencia para proveedores que aceptan varias imágenes en una tarea.

  • durationnumberopcional

    Duración del clip en segundos — una dimensión del nivel de precio; los valores admitidos están en la ficha del modelo.

  • secondsnumberopcional

    Alias que usan algunas familias de modelos para la duración del clip; considera duration como el campo preferido.

  • resolutionstringopcional

    Nivel de resolución de salida, como 720p o 1080p, cuando el modelo lo ofrece.

  • sizestringopcional

    Selector de relación de aspecto o tamaño para familias de modelos que usan tamaños del tipo ancho x alto.

  • webhook_urlstringopcional

    URL HTTPS a la que se llama cuando la tarea llega a un estado final — consulta la guía de video para conocer el contrato del callback.

  • webhook_secretstringopcional

    Si se define, las entregas incluyen X-Xiaoxiang-Signature: sha256=hex(HMAC-SHA256(body, secret)).

Reenvío de parámetros del proveedor

Las familias de modelos aceptan parámetros adicionales del proveedor (aspect_ratio, cfg_scale, negative_prompt …) que se reenvían sin cambios — la ficha del modelo los documenta; los campos desconocidos los rechaza el upstream, no el gateway.

Las tareas fallidas se reembolsan automáticamente

Las tareas de video se cobran por adelantado al enviarlas y se reembolsan por completo si la tarea termina en failed — el libro contable registra el reembolso con un enlace al cargo original.

#Cancelar una tarea en curso

DELETE/v1/videos/:task_id

Detiene una tarea que no ha llegado a un estado final. Si tiene éxito, la cuota reservada se reembolsa, la tarea se registra como fallida con el motivo "cancelled by user" y cualquier webhook que hayas registrado se dispara como task.failed.

La mayoría de los proveedores no permiten cancelar

La cancelación se reenvía al proveedor upstream, y solo algunos la ofrecen. Todos los demás responden 501 task_cancel_not_supported. Trata la cancelación como de mejor esfuerzo en tu UI: sigue consultando y no prometas un reembolso al usuario antes de que la llamada devuelva 200.
curl -X DELETE https://www.aisplice.store/v1/videos/task_xxx \
  -H "Authorization: Bearer sk-YOUR_KEY"
cancelled.json
{
  "id": "task_xxx",
  "task_id": "task_xxx",
  "status": "cancelled"
}

Ten en cuenta que "cancelled" solo aparece en esta respuesta. Una consulta posterior informa la tarea como failed, porque ese es el estado al que pasó.

  • 404 task_not_existId de tarea desconocido, o pertenece a otra cuenta.
  • 409 task_not_cancellableLa tarea ya terminó — no hay nada que detener.
  • 501 task_cancel_not_supportedEste proveedor no ofrece una API de cancelación.

Tabla completa de códigos de error →

#Hacer remix de un video existente

POST/v1/videos/:video_id/remix

Vuelve a renderizar un video terminado con un prompt nuevo, en los modelos que lo admiten. Envía prompt y nada más: el modelo, la duración, la resolución y los factores de precio se heredan de la tarea original, y la solicitud queda fijada al canal que la generó.

curl https://www.aisplice.store/v1/videos/task_xxx/remix \
  -H "Authorization: Bearer sk-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: remix-of-task_xxx" \
  -d '{"prompt": "Same shot, at night"}'
remix.json
{
  "task_id": "task_yyy",
  "status": "queued",
  "remixed_from_video_id": "task_xxx"
}

Un remix es una nueva tarea facturable

Cuesta lo mismo que el original, sigue el mismo ciclo de vida y devuelve su propio task_id. Consulta el id nuevo — el original no se modifica.
  • 400 invalid_requestprompt es obligatorio en un remix.
  • 400 task_not_existEl id del video de origen es desconocido o pertenece a otra cuenta.
  • 400 task_channel_disableEl canal que generó el video original ya no está habilitado.

Tabla completa de códigos de error →

#Errores relacionados

  • 404 not_foundRuta desconocida, nombre de modelo desconocido, o un task_id caducado o de otra cuenta.
  • 422 unprocessable_entityEl proveedor rechazó valores de parámetros que el gateway reenvió (p. ej. tamaño o duración no admitidos).
  • 401Bearer token no válido o ausente. Esta ruta no tiene error.code — compara por el estado.
  • 402 insufficient_user_quotaEl saldo de la billetera no cubre la estimación reservada previamente.
  • 429Limitación por clave. Cuerpo vacío; espera el Retry-After. Un 429 que sí incluye insufficient_user_quota indica en cambio un límite de gasto diario.
  • 503 model_not_foundModelo desconocido, o ningún canal sano lo atiende ahora mismo.

Tabla completa de códigos de error →

#Ejemplo de solicitud

# submit
curl https://www.aisplice.store/v1/videos \
  -H "Authorization: Bearer sk-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "doubao-seedance-2.5", "prompt": "A drone shot of a lighthouse at dawn"}'

# poll every 5s
curl https://www.aisplice.store/v1/videos/$TASK_ID -H "Authorization: Bearer sk-YOUR_KEY"

# download when completed
curl -L https://www.aisplice.store/v1/videos/$TASK_ID/content -o out.mp4 -H "Authorization: Bearer sk-YOUR_KEY"

#Respuesta

response.json
// POST — submit accepted
{"task_id": "task_xxx", "status": "queued"}

// GET /v1/videos/{task_id}
{
  "task_id": "task_xxx",
  "status": "in_progress",      // queued | in_progress | completed | failed
  "progress": "45%"
}

// terminal state
{
  "task_id": "task_xxx",
  "status": "completed",
  "metadata": {"url": "https://…"}
}

¿Sigues con el problema?

Envíanos el ID de solicitud o el mensaje de error y lo revisaremos.