Generación de vídeo asíncrona facturada por los tokens de vídeo reales. El borrador y la mejora son trabajos de pago separados. Se incluyen los tokens de los vídeos de referencia. Consulte el ID de trabajo devuelto; no vuelva a enviarlo tras un tiempo de espera del cliente. Se aplica revisión de contenido. No hay modo sin moderación. Aproximadamente el 95% de las tarifas públicas internacionales de BytePlus en USD, redondeado a un decimal. MP4 para uso general; MOV puede requerir descarga y reproductor compatible.
Probar en el Playground →Genera un vídeo final o revisa un borrador antes de renderizar a 1080p. Elige el flujo para ver sus parámetros y ejemplo.
¿Qué quieres hacer?
Generar un vídeo final
Parámetros de este pasoHereda texto, referencias y duración del borrador. No vuelvas a enviar esos campos.
| Parámetro | Tipo | Descripción |
|---|---|---|
| modelObligatorio | string | |
| promptOpcional | string | Prompt de texto. Use prompt O content. Obligatorio salvo para mejorar un borrador. |
| contentOpcional | array | Bloques text/image_url/video_url/audio_url. Referencias HTTPS: hasta 30 imágenes, 10 vídeos y 10 audio. No se aceptan IDs de recursos del proveedor. |
| durationOpcional | integer | 4–30 segundos; por defecto 5. Omítalo en las mejoras. |
| resolutionOpcional | string | |
| ratioOpcional | string | adaptive / 21:9 / 16:9 / 4:3 / 1:1 / 3:4 / 9:16 |
| output_formatOpcional | string | mp4 / mov. MP4 para uso general; MOV puede requerir descarga y reproductor compatible. |
| draft_task_idObligatorio | string | ID de tarea de la pasarela de tu borrador Token completado. No admite tareas por segundo, vídeos 480p normales ni IDs externos. |
Avanzado: borrador con el modelo estándar
Usa seedance-2.5-token con draft: true y resolution: 480p explícito. Un vídeo 480p sin draft: true no se puede mejorar.
Ejemplo de petición
Autenticación
Authorization: Bearer YOUR_API_KEY Content-Type: application/json
Crea una clave API en la consola para empezar.
Respuesta
Ejemplo del flujo completo · Python 3 · 480p → 1080p
Borrador → 1080p
Solo se puede mejorar un borrador Token completado de tu cuenta. No se admiten tareas por segundo, vídeos estándar de 480p ni ID externos.
Genera un borrador de 480p y consulta hasta succeeded. Envía su ID de NezhaGate como draft_task_id al modelo Token estándar para generar el vídeo final de 1080p a partir de la tarea original. No amplía cualquier MP4. No repitas prompt, content, duration, ratio, seed ni generate_audio. Borrador y vídeo final se cobran por separado.
Python 3, sin dependencias adicionales. Define NEZHAGATE_API_KEY y ejecuta el script una vez. Crea, consulta y mejora el borrador. Borrador y vídeo final se cobran por separado. No repitas todo el script para consultar una tarea existente.
import json
import os
import time
from urllib.error import HTTPError, URLError
from urllib.request import Request, urlopen
BASE_URL = "https://nezhagate.com"
API_KEY = os.environ["NEZHAGATE_API_KEY"]
def request(path, payload=None):
data = json.dumps(payload).encode() if payload is not None else None
req = Request(BASE_URL + path, data=data, headers={
"Authorization": "Bearer " + API_KEY,
"Content-Type": "application/json",
})
with urlopen(req, timeout=60) as response:
return json.load(response)
def submit(payload):
# Do not automatically retry a POST: its outcome may be unknown.
job = request("/v1/videos/generations", payload)
job_id = job["id"]
print("Submitted:", job_id, flush=True)
return job_id
def wait_for(job_id):
deadline = time.monotonic() + 1800
while time.monotonic() < deadline:
try:
job = request("/v1/videos/jobs/" + job_id)
except HTTPError as exc:
if exc.code != 429 and exc.code < 500:
raise
time.sleep(10)
continue
except (URLError, TimeoutError):
time.sleep(10)
continue
progress = job.get("progress", {})
print(job_id, job["status"], progress.get("phase", ""), flush=True)
if job["status"] == "succeeded":
return job
if job["status"] == "failed":
raise RuntimeError(json.dumps(job.get("error"), ensure_ascii=False))
time.sleep(5)
raise TimeoutError("Keep polling this job; do not resubmit: " + job_id)
if __name__ == "__main__":
# Two separately billed tasks. Save the printed IDs to resume polling.
draft_id = submit({
"model": "seedance-2.5-token-draft",
"prompt": "A sunrise over the sea",
"duration": 5,
"resolution": "480p",
})
draft = wait_for(draft_id)
print("Draft video:", draft["data"][0]["url"])
final_id = submit({
"model": "seedance-2.5-token",
"draft_task_id": draft_id,
"resolution": "1080p",
})
final = wait_for(final_id)
print("Final video:", final["data"][0]["url"])
Personas y referencias
API: sube los archivos a un almacenamiento HTTPS público y envía image_url, video_url o audio_url en content. Mantén los enlaces accesibles durante la tarea. NezhaGate importa las referencias a la biblioteca y espera a que todas estén Active antes de generar, también para referencias de personas reales. Subido no significa preparado. No necesitas llamar a otra API de biblioteca.
Puedes seleccionar y eliminar archivos subidos. El registro y la revisión empiezan tras Run, la confirmación y la reserva de saldo.
| Paso | Descripción |
|---|---|
| 1. Subir archivo | Sube la imagen del personaje a almacenamiento HTTPS público. JSON no acepta rutas locales ni archivos binarios. |
| 2. Enviar referencia | Envía image_url en content y menciona al personaje con @Image1 en el texto. |
| 3. Importar y revisar | NezhaGate importa y espera la revisión automáticamente. No necesitas crear grupos ni enviar ID asset://. |
| 4. Consultar resultado | Consulta progress en la misma tarea. Una referencia rechazada devuelve failed y error sin enviar la generación. |
- Hasta 30 imágenes, 10 vídeos y 10 audios; 50 en total. Vídeos de referencia: 30s combinados; audios: 30s combinados. Subida web: <30 MB/imagen, 50 MB/vídeo, 15 MB/audio. El JSON de la API acepta URL HTTPS, no rutas locales ni bytes. Imágenes originales de menos de 30 MB; lados 301–5999 px, proporción 0.4–2.5. Los retratos requieren preparación de materiales. MP4 para uso general; MOV puede requerir descarga y reproductor compatible.
data[0].source_url— El enlace original lo devuelve el servicio de vídeo y puede caducar. Guárdalo pronto o descarga nuestra copia original alojada.
curl https://nezhagate.com/v1/videos/generations \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"model": "seedance-2.5-token",
"content": [
{
"type": "text",
"text": "The character from @Image1 walks by the sea."
},
{
"type": "image_url",
"image_url": {
"url": "https://example.com/reference.jpg"
}
}
],
"duration": 5,
"resolution": "720p"
}'Consulta del estado
Consulta GET /v1/videos/jobs/{id} cada 3–5 segundos con la misma clave Bearer. Solo la cuenta propietaria puede consultar. Conserva status: queued / processing siguen consultando; succeeded lee data[0].url; failed lee error. progress se añade para Token; admite campos ausentes y fases futuras.
curl https://nezhagate.com/v1/videos/jobs/img_example -H 'Authorization: Bearer YOUR_API_KEY'
| progress.phase | Descripción |
|---|---|
| queued | En espera de procesamiento |
| preparing | Preparando referencias |
| reviewing | Revisando referencias |
| submitting | Enviando generación |
| provider_queued | En espera de generación |
| generating | Generando vídeo |
| delivering | Guardando vídeo |
| succeeded | Completado |
| material_failed | Referencia rechazada o importación fallida |
| submission_failed | Envío fallido o sin confirmar |
| generation_failed | Generación fallida |
| delivery_failed | Error al guardar |
| failed | Tarea fallida |
- phase es una etapa, no un porcentaje ni una estimación. ready / total cuentan referencias únicas listas / necesarias; pueden ser cero para texto y mejoras. label y detail son textos en inglés, no condiciones de programa. terminal refleja el estado final; failed_stage es null salvo fallo. Las etapas pueden omitirse o repetirse al recuperar.
- submitted=true confirma un ID de generación; false indica que no se inició el envío; null indica resultado de envío desconocido. No reenvíes automáticamente por null o timeout. reservation_released=true confirma liberación registrada con coste cero; false no demuestra un cobro. updated_at corresponde al registro del trabajo, no al cambio de fase; job_id es el ID de NezhaGate.
- El rechazo de parámetros, saldo o texto inicial devuelve un error HTTP antes de crear el trabajo, sin ID para consultar. La revisión inicial no garantiza aprobación final. Un fallo de importación/revisión detiene la generación y devuelve failed y error. Ante errores temporales, espera y consulta el mismo ID. No se añaden eventos webhook intermedios.
{
"id": "img_example",
"object": "video.generation.job",
"status": "processing",
"created": 1792800000,
"model": "seedance-2.5-token",
"progress": {
"phase": "reviewing",
"label": "Reviewing references",
"detail": "References ready: 3 / 5",
"ready": 3,
"total": 5,
"terminal": false,
"failed_stage": null,
"submitted": false,
"reservation_released": false,
"updated_at": "2026-10-24T05:00:00+00:00",
"job_id": "img_example"
}
}Requisitos de contenido
Todos los trabajos de Seedance pasan por una revisión de contenido que cubre el prompt, los archivos de referencia y el vídeo final, tanto la imagen como el sonido. Un trabajo que no la supera termina con content_policy y no se cobra.
Cuándo se revisa
Al enviar se revisan el prompt y las referencias; cuando el vídeo está generado se revisan de nuevo la imagen y el sonido. Por eso un rechazo puede llegar segundos después de enviar o solo al terminar el renderizado (puede tardar más de media hora). Un trabajo que termina con status failed y error.code content_policy no superó la revisión; con un webhook recibes el evento video.failed.
Sin cargo
Un trabajo rechazado no cuesta nada: el importe retenido al enviarlo se devuelve íntegro cuando termina, y el registro de llamadas lo muestra como no cobrado.
Sonido
El sonido (diálogos, narración, canto y efectos) lo genera el modelo a partir de tu prompt y se revisa junto con la imagen: los diálogos, la narración y las letras del prompt se locutan o se cantan. Para un vídeo sin voces, no pongas diálogos ni letras en el prompt. Cuando el sonido no supera la revisión, error.param es audio y el mensaje indica si fue el sonido generado o tu audio de referencia.
Contenido que más se rechaza
- Contenido sexual, desnudos o insinuación sexual, incluidas imágenes generadas o compuestas con IA
- Sangre, crueldad, autolesiones y heridas violentas como disparos o hemorragias
- Armas de fuego, explosivos y drogas
- Cualquier contenido sexualizado con menores; también se rechazan menores con alcohol, tabaco, drogas o en situaciones de peligro
- Políticos, famosos, deportistas, empresarios y otras figuras públicas, por su aspecto o su voz, incluidos los parecidos
- Personajes y propiedad intelectual protegidos, como personajes de Disney o Marvel
- Contenido de odio o discriminatorio, y noticias falsas
Guiones largos
Una sola toma que incumpla las normas hace fallar el vídeo entero, y donde más ocurre es en los guiones largos: un tiroteo o un primer plano de sangre en una escena de acción, o menores bebiendo o fumando, hunden todo el vídeo. Lee el guion completo antes de enviarlo y elimina o reescribe esas tomas.
Personas reales
Para usar la foto de una persona real como referencia necesitas el derecho a usar su imagen; si un modelo admite referencias de personas reales se indica más arriba en esta página.
Tras un rechazo
Reenviar lo mismo vuelve a ser rechazado. Localiza la parte que probablemente falla, reescribe el prompt o cambia la referencia y vuelve a enviarlo.
Código de error: content_policy · status: failed
Códigos de error
Todos los errores llevan error.message / error.type / error.code / error.param; decide según code. Abajo están los más habituales; la lista completa está en Códigos de error.
| HTTP | code | Descripción |
|---|---|---|
| 401 | invalid_api_key | Falta la clave, o es inválida o está desactivada (missing_api_key, invalid_api_key). |
| 402 | insufficient_quota | Saldo insuficiente, o la clave llegó a su presupuesto (insufficient_quota). |
| 400 | invalid_request | Un parámetro incorrecto o un modelo desconocido (como model_not_found); error.param indica el campo. |
| — | content_policy | No superó la revisión de contenido: se marcó el prompt, una referencia o la imagen o el sonido generados. No se cobra; lo mismo se rechazará de nuevo, así que reescribe el prompt o cambia la referencia. En los trabajos de vídeo llega en error cuando status es failed. |
| 429 | rate_limit_exceeded | Superaste el límite por minuto de esta clave o la cuota diaria de un modelo gratuito, o todas las líneas del modelo están ocupadas (rate_limit_exceeded). Espera los segundos de Retry-After si viene, o unos segundos si no, y reintenta. |
| 502 | upstream_* | El proveedor falló o tardó demasiado y cambiar de línea no bastó; code indica el motivo, por ejemplo upstream_timeout o upstream_unavailable. No se cobra; puedes reintentar. |