Tutorial
Por que uma requisição com falha na HiAPI ainda gera cobrança?
Sintoma do problema
Você envia uma tarefa de geração via POST para https://api.hiapi.ai/v1/tasks e depois faz polling com GET /v1/tasks/:id. O resultado que você recebe é "status": "fail", acompanhado de um objeto error, por exemplo {"code": "TASK_FAILED", "message": "task failed"}. O código de status HTTP dessa própria chamada de polling é o normal 200 — a HiAPI encapsula a informação de falha no corpo JSON, não no código de status. Como essa tarefa de fato passou por queued → handling antes de falhar, é fácil supor que essa tentativa foi cobrada como uma chamada normal. Na verdade, uma tarefa entrar no estado terminal fail não significa que foi cobrada — mas se você consultou o saldo antes do reembolso ser efetivado, aquela reserva feita na criação de fato faz o extrato parecer que houve cobrança.
Causas comuns
- Confundir a "reserva" com a "cobrança". No momento em que a tarefa é criada, antes mesmo de começar a rodar de verdade, a HiAPI reserva o valor estimado dessa tarefa. Essa reserva aparece imediatamente no seu saldo — mas ainda não é uma cobrança.
- Consultar o saldo com a tarefa em andamento. Entre
queued/handlinge o estado terminal, essa reserva fica "pendente", e esse é o comportamento projetado. Apenas o estado terminal (successoufail) a liquida. - Tratar "o downstream realmente rodou mas falhou" e "foi rejeitado na fase de criação" como a mesma coisa. Uma tarefa que chega a
status: "fail"(por exemplo,error.code: "TASK_FAILED") foi realmente criada, realmente executou e o downstream falhou — a documentação da HiAPI deixa claro que, depois que a tarefa entra nesse estado terminal, o valor reservado é reembolsado automaticamente na íntegra. Já uma requisição que nunca recebeu umtaskId— como um402 INSUFFICIENT_QUOTAretornado de forma síncrona — foi rejeitada antes de a tarefa existir, então nada foi reservado. Visto de fora, os dois casos parecem "falhas", mas somente o primeiro realmente passou pelo mecanismo de reserva. Idempotency-Keyusado de forma incorreta. Repetir a mesma requisição com a mesma key e o mesmo corpo retorna apenas otaskIdoriginal, sem criar nem cobrar uma segunda vez. Mas repetir com a mesma key e um corpo diferente retorna diretamente422 IDEMPOTENCY_KEY_MISMATCHna fase de criação; e repetir com a mesma key enquanto a primeira chamada ainda está sendo processada retorna409 IDEMPOTENCY_KEY_PROCESSING. Nenhum desses caminhos cria uma tarefa faturável.
Passos de correção
- Faça polling em
GET /v1/tasks/:ide observe diretamentedata.status— não tente adivinhar o resultado da cobrança com base em uma captura de tela do saldo em um dado momento.queued,handlingearchivingsão estados não terminais; somentesuccessefailsão terminais. - Se
data.statusfor"fail", esse é um resultado que será reembolsado. Verifiquedata.error.code(por exemplo,TASK_FAILED) para entender o motivo e consulte o saldo novamente — o reembolso é efetivado automaticamente depois que a tarefa entra nesse estado terminal. - Se a própria chamada
POST /v1/tasksretornou um código de status não 2xx (400/402/409/415/422) e o corpo não temtaskId, então não há tarefa a reembolsar — porque nenhuma tarefa foi criada nem cobrada. O caso específico de saldo insuficiente se manifesta comoerror_code: "INSUFFICIENT_QUOTA"na resposta402. - Acesse o painel de faturamento da HiAPI para conferir o par de transações "reserva—reembolso", em vez de olhar apenas o número do saldo em um instante específico.
- Ao tentar novamente uma tarefa que falhou, use uma nova
Idempotency-Keypara essa tentativa realmente nova. Não repita usando a key antiga com um corpo diferente (isso aciona422) nem envie novamente com a mesma key enquanto a primeira requisição ainda está sendo processada (isso aciona409). - Se você confirmar que a tarefa chegou ao estado terminal
fail, mas após algum tempo o valor reservado ainda não foi devolvido, isso já está fora do escopo desse mecanismo de reembolso automático — entre em contato com o suporte diretamente, não presuma que vai se resolver sozinho.
Exemplo mínimo de verificação
curl -s -X POST https://api.hiapi.ai/v1/tasks \
-H "Authorization: Bearer $HIAPI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"model": "gpt-image-2/text-to-image",
"input": { "prompt": "a minimalist desk setup, studio lighting" }
}'
Aqui o campo model inclui o sufixo de rota /text-to-image. Até o momento em que este artigo foi escrito, no índice de modelos da HiAPI, o grupo gpt-image-2 só contém entradas com sufixo de rota (/text-to-image, /image-to-image), sem entradas com id puro. Se é necessário ou não incluir o sufixo, e qual sufixo usar, consulte sempre as entradas com availability: "online" nesse índice de modelos em tempo real — não copie o formato de outros modelos ou de documentação antiga.
Depois de obter o taskId retornado, faça polling:
curl -s https://api.hiapi.ai/v1/tasks/$TASK_ID \
-H "Authorization: Bearer $HIAPI_API_KEY"
Uma tarefa com falha que foi reembolsada se parece com isto:
{
"code": 200,
"message": "success",
"data": {
"taskId": "tk-hiapi-...",
"model": "gpt-image-2/text-to-image",
"status": "fail",
"created": 1777282033,
"completed": 1777282099,
"error": { "code": "TASK_FAILED", "message": "task failed" }
}
}
Links internos relacionados
- Painel de faturamento da HiAPI
- API unificada de tarefas assíncronas da HiAPI: códigos de erro e descrição de estados
- Tarefa da HiAPI travada ou com timeout: guia de diagnóstico e nova tentativa
- Guia de correção dos erros "model not found" / "model not available" da HiAPI
FAQ
Se uma tarefa de imagem ou vídeo falhar, a HiAPI vai me cobrar?
Não. Assim que a tarefa entra no estado terminal fail, o valor reservado na criação é reembolsado automaticamente na íntegra.
Meu saldo diminuiu logo depois que enviei a tarefa, e ela depois falhou. Por que o saldo não voltou?
Essa redução foi a reserva feita na criação, não uma cobrança. Ela é liquidada automaticamente depois que a tarefa entra no estado terminal — em fail é devolvida, e somente em success é de fato consumida.
Qual é a diferença entre o erro 402 e uma falha de tarefa?
402 INSUFFICIENT_QUOTA significa que a tarefa nunca chegou a ser criada, então não há nada a reservar nem a reembolsar. Já uma tarefa que recebeu um taskId e depois teve status alterado para "fail" foi realmente criada, realmente executou e então o downstream falhou; a HiAPI devolve automaticamente essa reserva.
Se eu tentar novamente com a mesma Idempotency-Key, serei cobrado duas vezes?
Não. Repetir com a mesma key e o mesmo corpo retorna apenas o taskId original, sem criar uma nova tarefa. Se o corpo for alterado sob a mesma key, será retornado diretamente 422 IDEMPOTENCY_KEY_MISMATCH, e também não será criada uma tarefa duplicada.
Onde posso ver os registros de reserva e reembolso? No faturamento e no histórico de transações do painel de faturamento da HiAPI.
Artigos relacionados
Ver todos os artigos →-
Tutorial
Como chamar hailuo-2.3-fast/image-to-video pela API HiAPI: curl e Python na prática
A primeira requisição executável do nível rápido e econômico de geração de vídeo a partir de imagem — do ID do modelo ao download do MP4
-
Tutorial
Como chamar hailuo-2.3/text-to-video pela API HiAPI: curl, Python e exemplos de requisição executáveis
-
Tutorial
Usar Kandinsky 6.0 Pro text-to-video na HiAPI: tutorial de curl e Python
Demonstração prática com foco na requisição: montar a chamada de prompt para clipe de vídeo, enviar a requisição, consultar o status de conclusão e baixar o resultado