Webhooks
Les webhooks Sync Labs envoient des notifications HTTP POST en temps réel quand vos jobs de génération lip sync se terminent ou échouent. Utilisez les webhooks au lieu du polling pour créer des workflows efficaces orientés événements qui réagissent aux changements de statut sans appels API répétés.
Comment configurer les webhooks?
Pour utiliser les webhooks:
- Spécifiez un paramètre
webhookUrllorsque vous appelez un endpoint API qui le prend en charge. - Assurez-vous que votre endpoint webhook peut recevoir et traiter les requêtes HTTP
POST, et consommer le Webhook Payload des mises à jour de statut.
Pour des raisons de sécurité, votre URL webhook doit être configurée pour accepter et
traiter des requêtes HTTPS POST.
En exploitant les webhooks, vous simplifiez votre workflow avec des appels non bloquants, ce qui vous permet de vous concentrer sur d’autres tâches tout en recevant les notifications de fin de job.
Si vous ne recevez pas d’événements, confirmez que la valeur exacte webhookUrl a bien été incluse dans la requête de génération, que l’endpoint est publiquement accessible en HTTPS, et qu’il renvoie rapidement une réponse 2xx aux requêtes POST. Si la livraison est manquée parce que votre endpoint est indisponible ou rejette la requête, interrogez l’endpoint de statut de génération comme solution de repli.
Quand les webhooks sont-ils envoyés?
Un webhook de génération est envoyé quand la génération atteint un statut final : COMPLETED, FAILED ou REJECTED. Un webhook de batch est envoyé quand le batch est COMPLETED ou FAILED.
Chaque requête contient ces headers :
Relances et doublons
Sync relance les webhooks que votre endpoint n’a pas acceptés, pour les générations comme pour les batches :
- Jusqu’à 6 tentatives sur environ 2 heures. Les relances attendent environ 1, 3, 9, 27 et 60 minutes (±25 % d’aléa).
- Ce qui est relancé : les timeouts, les erreurs de connexion et les réponses
429et5xx. Un headerRetry-Aftersur ces réponses remplace le délai calculé (entre 1 seconde et 60 minutes). - Ce qui n’est pas relancé : toute autre réponse
4xx, y compris408, une URL invalide ou une redirection autre que307/308. La livraison s’arrête à la première réponse de ce type. - Timeout : chaque tentative attend votre réponse jusqu’à 10 secondes. Renvoyez
2xximmédiatement et faites le travail long ensuite. - Destinations : l’URL doit résoudre vers une adresse publique. Jusqu’à trois redirections
307/308sont suivies.
Une relance peut arriver après que votre endpoint a déjà traité l’événement, par exemple quand votre réponse 2xx a dépassé le timeout : gérez donc les doublons. Dédupliquez avec le header Sync-Delivery-Id, ou avec l’id de la génération ou du batch dans le payload. Chaque tentative est signée à nouveau avec un nouveau timestamp, donc la valeur de Sync-Signature change entre les tentatives d’une même livraison.
Si toutes les tentatives échouent, l’événement n’est plus renvoyé. Interrogez Get Generation ou Get Batch pour récupérer les résultats manqués.
Gestion des erreurs dans les webhooks
Le payload du webhook de génération contient les mêmes champs que Get Generation pour id, createdAt, status, model, input, webhookUrl, options et outputUrl, ainsi que synthesizedAudioUrl pour les générations qui ont utilisé une entrée texte. Quand une génération échoue ou est rejetée, deux champs en donnent la raison ; sinon, les deux valent null :
error: message d’erreur lisible par un humain, décrivant ce qui a échouéerrorCode: code d’erreur lisible par une machine, pour une gestion programmatique (voir le guide gestion des erreurs etGET /v2/errorspour la liste complète)
Basez votre logique sur errorCode, pas sur le texte du message. Voir la référence du payload pour tous les champs.
Vérifier les signatures webhook
Pour garantir que les requêtes webhook proviennent de Sync Labs, nous signons chaque requête webhook. La signature est incluse dans le header Sync-Signature.
Pour vérifier les signatures, utilisez votre signing secret. Vous pouvez aussi le récupérer de façon programmatique avec GET /v2/organizations/webhook/secret. Conservez la valeur complète whsec_... en lieu sûr ; masked=true sert uniquement à l’affichage et ne doit pas être utilisé pour la vérification.
Le header a la forme t=<timestamp>,v1=<signature> :
t: l’heure Unix, en secondes, à laquelle cette tentative a été envoyéev1: le HMAC-SHA256 en hex de<t>.<body brut de la requête>, avec votre signing secret comme clé
Calculez le HMAC sur les octets exacts reçus, pas sur du JSON resérialisé. Pour limiter les rejeux, vous pouvez aussi refuser les requêtes dont t est éloigné de votre heure actuelle ; laissez quelques minutes de marge pour le décalage d’horloge.
Ressources associées
- traitement par lots — utilisez les webhooks avec le traitement par lots pour les workflows à haut volume
- Rate Limits — comprendre le rate limiting API et son impact sur la livraison webhook
Questions fréquentes
Comment tester des webhooks en local?
Utilisez un outil de tunneling comme ngrok pour exposer votre serveur local sur internet. Démarrez votre endpoint webhook en local, puis lancez ngrok pour obtenir une URL HTTPS publique. Passez cette URL comme webhookUrl lors de la création d’une génération. Sync Labs enverra les requêtes POST vers votre serveur local via le tunnel.
Que se passe-t-il si mon endpoint est indisponible?
Sync relance les timeouts, les erreurs de connexion et les réponses 429 et 5xx jusqu’à 6 fois sur environ 2 heures, en respectant Retry-After. Les autres réponses 4xx ne sont pas relancées. Si votre endpoint reste indisponible après la dernière tentative, l’événement n’est plus renvoyé : interrogez l’endpoint de statut de la génération ou du batch pour récupérer les résultats manqués. Les relances peuvent livrer le même événement plusieurs fois ; dédupliquez avec le header Sync-Delivery-Id ou l’id de la génération ou du batch.
Comment vérifier les signatures webhook?
Chaque requête webhook inclut un header Sync-Signature contenant un timestamp et un hash HMAC-SHA256. Utilisez votre signing secret depuis la page des paramètres webhooks pour calculer la signature attendue et comparez-la avec une fonction de comparaison temporellement sûre afin d’éviter les attaques de timing. Voir les exemples de code ci-dessus.

