Skip to main content
Informe webhook.url em uma tarefa e enviaremos o resultado por POST quando a tarefa chegar a um estado final: COMPLETED ou FAILED.

Payload de entrega

Enviamos por POST Content-Type: application/json com este corpo:
object
obrigatório
Os mesmos metadados de tarefa recebidos no envio, agora com um status final e o seu idempotencyKey devolvido.
object
obrigatório
O custo em créditos do mecanismo: 2 para Perplexity, 3 para ChatGPT e assim por diante (1–3 créditos conforme o mecanismo). creditsCharged é 0 quando a tarefa falhou. Ao contrário das respostas de envio e polling, que sempre informam zero, este campo não é zero.
object
obrigatório
O resultado específico do mecanismo. Veja Mecanismos. Em uma tarefa com falha, é { "error": "<reason>" } em vez do resultado do mecanismo.
Uma tarefa com falha também é entregue:

Novas tentativas

Retorne qualquer 2xx para confirmar. Qualquer outra coisa, inclusive um timeout, é falha, e tentamos de novo com backoff exponencial: Depois da quinta tentativa, a entrega é abandonada e registrada em log. Não existe fila de mensagens mortas que você possa ler. Para obter o resultado pela API de tarefas, consulte dentro da janela pública de polling de 24 horas. Essa janela não define a vida útil do registro subjacente. Cada tentativa tem timeout de requisição de 30 segundos.
Do ponto de vista da tarefa, a entrega é do tipo “enviar e esquecer”. Uma tarefa concluída cujo webhook nunca é entregue continua mostrando COMPLETED em GET /v1/async/task/{id}: o status descreve o trabalho do mecanismo, não a notificação.

Escrevendo um handler seguro

1

Confirme rápido

Retorne 200 assim que tiver enfileirado o payload de forma persistente. Faça o parsing e as gravações no banco depois. Um handler lento consome o timeout de 30 segundos e provoca uma nova tentativa indesejada.
2

Deduplique pelo idempotencyKey

Por causa das novas tentativas, seu handler pode receber legitimamente a mesma tarefa mais de uma vez. Compare por task.idempotencyKey (ou task.id) e torne a gravação idempotente.
3

Ramifique pelo status, não pela presença

Verifique task.status === "FAILED" explicitamente. Uma tarefa com falha também entrega webhook.
As requisições de webhook não têm assinatura nem segredo compartilhado. Se seu endpoint for público, trate o payload como não confiável e use um caminho de URL impossível de adivinhar, ou coloque o handler atrás de restrições de rede.