Texto a vídeo
Empieza con un prompt de texto si no necesitas medios de origen. Selecciona seedance-2.0 o seedance-2.5 y revisa sus ajustes de salida.
API de vídeo
Compara API de vídeo Seedance para texto a vídeo y flujos con referencias. Revisa entradas, precios, consulta de tareas y recuperación del vídeo completado.
Los modelos Seedance actuales se facturan por tokens de finalización. La duración afecta al uso estimado, pero no es la unidad de liquidación. Conserva el ID de tarea para obtener el resultado o informar de un fallo.
Para una tarea concreta
Empieza con un prompt de texto si no necesitas medios de origen. Selecciona seedance-2.0 o seedance-2.5 y revisa sus ajustes de salida.
Anima una imagen inicial con un prompt de movimiento. Usa la guía de imagen a vídeo del modelo elegido sin mezclar campos de otros modos de entrada.
Proporciona un primer fotograma y, si hace falta, uno final para guiar los extremos de la toma. Revisa los roles de fotogramas y requisitos de medios en la guía.
Combina referencias según sus roles documentados de imagen, vídeo y audio. Se requiere al menos una referencia de imagen o vídeo; solo audio no basta.
Unidad de facturación
USD por millón de tokens de finalización. La tarifa depende del modelo, resolución de salida y condiciones de referencia de vídeo.
Límites operativos
Guías de integración
Cobertura actual del catálogo
Compara ID API, operaciones, proveedores y precios. Comprueba la fecha del catálogo y la unidad de facturación de cada operación antes de estimar costes.
Genera vídeos con Seedance 2.0.
POST /v1/video/seedance Referencia de Envío de tarea de vídeo GET /v1/jobs/{id} Referencia de Consulta de tareas 480p · Con vídeo de referencia
Precio oficial
Precio de API Hop Ahorro 5%
480p · Sin vídeo de referencia
Precio oficial
Precio de API Hop Ahorro 5%
720p · Con vídeo de referencia
Precio oficial
Precio de API Hop Ahorro 5%
720p · Sin vídeo de referencia
Precio oficial
Precio de API Hop Ahorro 5%
1080p · Con vídeo de referencia
Precio oficial
Precio de API Hop Ahorro 5%
1080p · Sin vídeo de referencia
Precio oficial
Precio de API Hop Ahorro 5%
4k · Con vídeo de referencia
Precio oficial
Precio de API Hop Ahorro 5%
4k · Sin vídeo de referencia
Precio oficial
Precio de API Hop Ahorro 5%
Precio de referencia no verificado de forma independiente. Consulta las tarifas actuales, unidades de facturación y condiciones aplicables del proveedor antes de comparar costes.
Genera vídeos con Seedance 2.5.
POST /v1/video/seedance Referencia de Envío de tarea de vídeo GET /v1/jobs/{id} Referencia de Consulta de tareas 480p · Con vídeo de referencia
Precio oficial
Precio de API Hop Ahorro 2%
480p · Sin vídeo de referencia
Precio oficial
Precio de API Hop Ahorro 2%
720p · Con vídeo de referencia
Precio oficial
Precio de API Hop Ahorro 2%
720p · Sin vídeo de referencia
Precio oficial
Precio de API Hop Ahorro 2%
1080p · Con vídeo de referencia
Precio oficial
Precio de API Hop Ahorro 2%
1080p · Sin vídeo de referencia
Precio oficial
Precio de API Hop Ahorro 2%
Precio de referencia no verificado de forma independiente. Consulta las tarifas actuales, unidades de facturación y condiciones aplicables del proveedor antes de comparar costes.
Ejemplo de solicitud
Estos ejemplos envían una tarea Seedance 2.5 de texto a vídeo, guardan jobId y consultan GET /v1/jobs/{jobId} con límite de tiempo. Recupera outputResult solo tras COMPLETED; trata FAILED y CANCELLED por separado. Son ejemplos de integración, no demostraciones de vídeo.
# Requires bash, curl and jq. A polling timeout does not cancel the job.
set -euo pipefail
BASE_URL="https://api.apihop.ai"
API_KEY='YOUR_API_KEY'
created=$(curl --fail-with-body --silent --show-error --max-time 30 \
"$BASE_URL/v1/video/seedance" \
-H "Authorization: Bearer $API_KEY" -H 'Content-Type: application/json' \
--data '{"model":"seedance-2.5","prompt":"A calm city street at dawn","duration":5,"resolution":"720p"}')
job_id=$(printf '%s' "$created" | jq -er '.data.jobId | select(. != null) | tostring')
deadline=$((SECONDS + 600))
while (( SECONDS < deadline )); do
job=$(curl --fail-with-body --silent --show-error --max-time 30 \
"$BASE_URL/v1/jobs/$job_id" -H "Authorization: Bearer $API_KEY")
status=$(printf '%s' "$job" | jq -er '.data.status')
case "$status" in
COMPLETED) printf '%s' "$job" | jq -e '.data.outputResult'; exit 0 ;;
FAILED|CANCELLED) printf 'Job %s: %s\n' "$job_id" "$status" >&2; exit 1 ;;
esac
sleep 5
done
printf 'Polling timed out; retain jobId for a later status check: %s\n' "$job_id" >&2
exit 1const baseUrl = "https://api.apihop.ai";
const headers = { Authorization: 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json' };
async function request(path, options = {}) {
const response = await fetch(baseUrl + path, { ...options, headers, signal: AbortSignal.timeout(30000) });
if (!response.ok) throw new Error('HTTP ' + response.status);
const result = await response.json();
if (result.success === false) throw new Error(JSON.stringify(result.error));
return result.data;
}
const created = await request('/v1/video/seedance', { method: 'POST', body: JSON.stringify({"model":"seedance-2.5","prompt":"A calm city street at dawn","duration":5,"resolution":"720p"}) });
if (!created?.jobId) throw new Error('Missing data.jobId');
const deadline = Date.now() + 10 * 60 * 1000;
let completed = false;
while (Date.now() < deadline) {
const job = await request('/v1/jobs/' + encodeURIComponent(created.jobId));
if (job.status === 'COMPLETED') {
if (job.outputResult == null) throw new Error('Completed job has no outputResult');
console.log(job.outputResult);
completed = true;
break;
}
if (['FAILED', 'CANCELLED'].includes(job.status)) throw new Error('Job ' + job.status);
await new Promise(resolve => setTimeout(resolve, 5000));
}
if (!completed) throw new Error('Polling timed out; retain jobId for a later status check: ' + created.jobId);import json
import time
import urllib.request
base_url = "https://api.apihop.ai"
headers = {'Authorization': 'Bearer YOUR_API_KEY', 'Content-Type': 'application/json'}
def request(path, body=None):
data = json.dumps(body).encode() if body is not None else None
req = urllib.request.Request(base_url + path, data=data, headers=headers)
with urllib.request.urlopen(req, timeout=30) as response:
result = json.load(response)
if result.get('success') is False:
raise RuntimeError(result.get('error'))
return result['data']
created = request('/v1/video/seedance', json.loads("{\"model\":\"seedance-2.5\",\"prompt\":\"A calm city street at dawn\",\"duration\":5,\"resolution\":\"720p\"}"))
job_id = str(created['jobId'])
deadline = time.monotonic() + 600
while time.monotonic() < deadline:
job = request('/v1/jobs/' + job_id)
if job['status'] == 'COMPLETED':
if job.get('outputResult') is None:
raise RuntimeError('Completed job has no outputResult')
print(job['outputResult'])
break
if job['status'] in ('FAILED', 'CANCELLED'):
raise RuntimeError('Job ' + job['status'])
time.sleep(5)
else:
raise TimeoutError('Polling timed out; retain jobId for a later status check: ' + job_id) Usa la URL base API de la documentación de tu cuenta y sustituye los marcadores. Envía tu clave API en el encabezado Authorization, nunca en una URL o archivo del repositorio.