Webhooks
Sync Labs webhooks fornece notificações POST HTTP em tempo real quando seus trabalhos de geração lip sync são concluídos ou falham. Use webhooks em vez de sondagem para criar fluxos de trabalho eficientes e orientados a eventos que respondam às mudanças de status de geração sem chamadas API repetidas.
Como configuro o webhooks?
Para utilizar webhooks:
- Especifique um parâmetro
webhookUrlao chamar um API endpoint que o suporte. - Certifique-se de que seu webhook endpoint possa receber e lidar com solicitações HTTP
POSTe possa consumir a [carga útil do Webhook para atualizações de status] (/api-reference/api/webhooks-payload-reference/webhooks).
Por motivos de segurança, seu webhook URL deve ser configurado para aceitar e
processar solicitações HTTPS POST.
Ao aproveitar o webhooks, você pode agilizar seu fluxo de trabalho com chamadas sem bloqueio, permitindo que você se concentre em outras tarefas enquanto recebe notificações de conclusão de trabalhos.
Se você não estiver recebendo eventos, confirme se o webhookUrl exato foi incluído na solicitação de geração, o endpoint pode ser acessado publicamente por meio de HTTPS e retorna uma resposta 2xx às solicitações POST rapidamente. Se a entrega for perdida porque seu endpoint está indisponível ou rejeitou a solicitação, pesquise o status de geração endpoint como substituto.
Quando os webhooks são enviados?
Um webhook de geração é enviado quando a geração chega a um status final: COMPLETED, FAILED ou REJECTED. Um webhook de batch é enviado quando o batch fica COMPLETED ou FAILED.
Cada solicitação traz estes cabeçalhos:
Novas tentativas e duplicatas
A Sync tenta novamente os webhooks que o seu endpoint não aceitou, tanto de gerações quanto de batches:
- Até 6 tentativas ao longo de cerca de 2 horas. As novas tentativas esperam aproximadamente 1, 3, 9, 27 e 60 minutos (±25% de variação).
- O que é repetido: timeouts, erros de conexão e respostas
429e5xx. Um cabeçalhoRetry-Afternessas respostas substitui a espera calculada (entre 1 segundo e 60 minutos). - O que não é repetido: qualquer outra resposta
4xx, incluindo408, uma URL inválida ou um redirecionamento diferente de307/308. A entrega para na primeira resposta desse tipo. - Timeout: cada tentativa espera até 10 segundos pela sua resposta. Retorne
2xximediatamente e faça o trabalho demorado depois. - Destinos: a URL precisa resolver para um endereço público. São seguidos até três redirecionamentos
307/308.
Uma nova tentativa pode chegar depois que o seu endpoint já processou o evento, por exemplo quando a sua resposta 2xx passou do timeout, então trate duplicatas. Elimine duplicatas pelo cabeçalho Sync-Delivery-Id ou pelo id da geração ou do batch no payload. Cada tentativa é assinada de novo com um novo timestamp, então o valor de Sync-Signature muda entre tentativas da mesma entrega.
Se todas as tentativas falharem, o evento não é enviado de novo. Consulte Get Generation ou Get Batch para recuperar os resultados perdidos.
Tratamento de erros em webhooks
O payload do webhook de geração tem os mesmos campos que Get Generation para id, createdAt, status, model, input, webhookUrl, options e outputUrl, além de synthesizedAudioUrl nas gerações que usaram uma entrada de texto. Quando uma geração falha ou é rejeitada, dois campos explicam o motivo; nos demais casos, ambos são null:
error: uma mensagem de erro legível descrevendo o que deu erradoerrorCode: um código de erro legível por máquina para o tratamento programático de erros (consulte o Guia de tratamento de erros eGET /v2/errorspara a lista completa)
Baseie a lógica em errorCode, não no texto da mensagem. Veja a referência do payload para todos os campos.
Verifique as assinaturas webhook
Para garantir que as solicitações webhook sejam provenientes de Sync Labs, assinamos cada solicitação webhook com uma assinatura. A assinatura está incluída no cabeçalho Sync-Signature.
Para verificar assinaturas, use seu segredo de assinatura. Você também pode recuperá-lo programaticamente com GET /v2/organizations/webhook/secret. Guarde o valor completo whsec_... com segurança; masked=true serve apenas para exibição e não deve ser usado na verificação.
O cabeçalho tem a forma t=<timestamp>,v1=<assinatura>:
t: o horário Unix, em segundos, em que esta tentativa foi enviadav1: o HMAC-SHA256 em hex de<t>.<corpo bruto da solicitação>, com o seu segredo de assinatura como chave
Calcule o HMAC sobre os bytes exatos que você recebeu, não sobre um JSON serializado de novo. Para limitar repetições, você também pode rejeitar solicitações cujo t esteja longe do seu horário atual; deixe alguns minutos de margem para diferenças de relógio.
Recursos relacionados - Processamento em batch — use webhooks com processamento batch para fluxos de trabalho de alto volume - Limites de taxa - entenda API rate limiting e como isso afeta a entrega de webhook
Perguntas frequentes
Como faço para testar o webhooks localmente?
Use uma ferramenta de tunelamento como o ngrok para expor seu servidor local à Internet. Inicie seu webhook endpoint localmente e execute o ngrok para obter um HTTPS URL público. Passe esse URL como webhookUrl ao criar uma geração. Sync Labs enviará solicitações POST ao seu servidor local através do túnel.
E se meu endpoint estiver inoperante?
A Sync tenta novamente timeouts, erros de conexão e respostas 429 e 5xx até 6 vezes ao longo de cerca de 2 horas, respeitando Retry-After. Outras respostas 4xx não são repetidas. Se o seu endpoint continuar fora do ar depois da última tentativa, o evento não é enviado de novo, então consulte o endpoint de status da geração ou do batch para recuperar os resultados perdidos. As novas tentativas podem entregar o mesmo evento mais de uma vez; elimine duplicatas pelo header Sync-Delivery-Id ou pelo id da geração ou do batch.
Como verifico as assinaturas webhook?
Cada solicitação webhook inclui um cabeçalho Sync-Signature contendo um carimbo de data/hora e um hash HMAC-SHA256. Use seu segredo de assinatura na página de configurações do webhooks para calcular a assinatura esperada e compará-la usando uma função de comparação segura de tempo para evitar ataques de temporização. Veja os exemplos de código acima.

