Texto em vídeo
Comece com um prompt de texto quando não precisar de mídia de origem. Selecione seedance-2.0 ou seedance-2.5 e confira as configurações de saída do modelo.
APIs de vídeo
Compare APIs de vídeo Seedance para texto em vídeo e fluxos com referências. Confira entradas, preços, consulta de tarefas e obtenção do vídeo concluído.
Os modelos Seedance atuais são cobrados por tokens de conclusão. A duração afeta o uso estimado, mas não é a unidade de liquidação. Guarde o ID da tarefa para obter o resultado ou relatar uma falha.
Para uma tarefa específica
Comece com um prompt de texto quando não precisar de mídia de origem. Selecione seedance-2.0 ou seedance-2.5 e confira as configurações de saída do modelo.
Anime uma imagem inicial com um prompt de movimento. Use o guia de imagem em vídeo do modelo escolhido sem misturar campos de outros modos de entrada.
Forneça o primeiro quadro e, se necessário, o último para orientar os extremos da cena. Confira os papéis dos quadros e requisitos de mídia no guia do modelo.
Combine referências conforme seus papéis documentados de imagem, vídeo e áudio. É necessária pelo menos uma imagem ou vídeo; apenas áudio não é suficiente.
Unidade de cobrança
USD por milhão de tokens de conclusão. A tarifa depende do modelo, resolução de saída e condições de referência de vídeo.
Limites operacionais
Guias de integração
Cobertura atual do catálogo
Compare IDs de API, operações, provedores e preços. Verifique a data do catálogo e a unidade de cobrança de cada operação antes de estimar os custos.
Gere vídeos com Seedance 2.0.
POST /v1/video/seedance Referência de Envio de tarefa de vídeo GET /v1/jobs/{id} Referência de Consulta de tarefas 480p · Com vídeo de referência
Preço oficial
Preço do API Hop Economia 5%
480p · Sem vídeo de referência
Preço oficial
Preço do API Hop Economia 5%
720p · Com vídeo de referência
Preço oficial
Preço do API Hop Economia 5%
720p · Sem vídeo de referência
Preço oficial
Preço do API Hop Economia 5%
1080p · Com vídeo de referência
Preço oficial
Preço do API Hop Economia 5%
1080p · Sem vídeo de referência
Preço oficial
Preço do API Hop Economia 5%
4k · Com vídeo de referência
Preço oficial
Preço do API Hop Economia 5%
4k · Sem vídeo de referência
Preço oficial
Preço do API Hop Economia 5%
Preço de referência não verificado de forma independente. Confira as tarifas atuais, unidades de cobrança e condições aplicáveis do fornecedor antes de comparar custos.
Gere vídeos com Seedance 2.5.
POST /v1/video/seedance Referência de Envio de tarefa de vídeo GET /v1/jobs/{id} Referência de Consulta de tarefas 480p · Com vídeo de referência
Preço oficial
Preço do API Hop Economia 2%
480p · Sem vídeo de referência
Preço oficial
Preço do API Hop Economia 2%
720p · Com vídeo de referência
Preço oficial
Preço do API Hop Economia 2%
720p · Sem vídeo de referência
Preço oficial
Preço do API Hop Economia 2%
1080p · Com vídeo de referência
Preço oficial
Preço do API Hop Economia 2%
1080p · Sem vídeo de referência
Preço oficial
Preço do API Hop Economia 2%
Preço de referência não verificado de forma independente. Confira as tarifas atuais, unidades de cobrança e condições aplicáveis do fornecedor antes de comparar custos.
Exemplo de solicitação
Estes exemplos enviam uma tarefa Seedance 2.5 de texto em vídeo, guardam jobId e consultam GET /v1/jobs/{jobId} com limite de tempo. Obtenha outputResult somente após COMPLETED; trate FAILED e CANCELLED separadamente. São exemplos de integração, não demonstrações 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) Use a URL base API da documentação da conta e substitua os marcadores. Envie a chave no cabeçalho Authorization, nunca em uma URL ou arquivo do repositório.