NezhaGateNezhaGate
seedance-2.5-token

Seedance 2.5 · Token · API

POST https://nezhagate.com/v1/videos/generations

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 paso
ParámetroTipoDescripción
modelObligatoriostring
promptOpcionalstringPrompt de texto. Use prompt O content. Obligatorio salvo para mejorar un borrador.
contentOpcionalarrayBloques 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.
durationOpcionalinteger4–30 segundos; por defecto 5. Omítalo en las mejoras.
resolutionOpcionalstring
ratioOpcionalstringadaptive / 21:9 / 16:9 / 4:3 / 1:1 / 3:4 / 9:16
output_formatOpcionalstringmp4 / mov. MP4 para uso general; MOV puede requerir descarga y reproductor compatible.
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.

cURL · POST /v1/videos/generations

Respuesta

202 · JSON
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.

Python 3 · 480p → 1080p
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.

PasoDescripción
1. Subir archivoSube la imagen del personaje a almacenamiento HTTPS público. JSON no acepta rutas locales ni archivos binarios.
2. Enviar referenciaEnvía image_url en content y menciona al personaje con @Image1 en el texto.
3. Importar y revisarNezhaGate importa y espera la revisión automáticamente. No necesitas crear grupos ni enviar ID asset://.
4. Consultar resultadoConsulta 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 · Personas y referencias
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 · GET /v1/videos/jobs/{id}
curl https://nezhagate.com/v1/videos/jobs/img_example -H 'Authorization: Bearer YOUR_API_KEY'
progress.phaseDescripción
queuedEn espera de procesamiento
preparingPreparando referencias
reviewingRevisando referencias
submittingEnviando generación
provider_queuedEn espera de generación
generatingGenerando vídeo
deliveringGuardando vídeo
succeededCompletado
material_failedReferencia rechazada o importación fallida
submission_failedEnvío fallido o sin confirmar
generation_failedGeneración fallida
delivery_failedError al guardar
failedTarea 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.
200 · JSON
{
  "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.

HTTPcodeDescripción
401invalid_api_keyFalta la clave, o es inválida o está desactivada (missing_api_key, invalid_api_key).
402insufficient_quotaSaldo insuficiente, o la clave llegó a su presupuesto (insufficient_quota).
400invalid_requestUn parámetro incorrecto o un modelo desconocido (como model_not_found); error.param indica el campo.
—content_policyNo 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.
429rate_limit_exceededSuperaste 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.
502upstream_*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.

Lista completa de códigos de error →