Aller au contenu

Webhooks

Les webhooks Gaard vous permettent de recevoir les résultats de classification sous forme de POST HTTP vers votre propre endpoint dès que le traitement est terminé.

Pour les intégrateurs, l’idée principale est simple :

  • votre système envoie une vidéo à Gaard
  • Gaard la classifie de manière asynchrone
  • lorsque le résultat final est disponible, Gaard envoie le JSON du résultat à votre URL de webhook
Pipeline de traitement POST /api/classify Webhook POST (JSON) Votre système Votre endpoint webhook Votre file, système d'incident ou workflow métier API Gaard Pipeline de classification Résultat stocké

Gaard envoie actuellement un seul type d’événement webhook : le résultat de classification final.

La charge utile du webhook utilise la même forme JSON que le résultat renvoyé par :

  • GET /api/result/{id}
  • POST /api/classify?sync=true

Cela signifie que vous pouvez généralement réutiliser le même parseur pour les intégrations par polling et par webhook.

  1. Votre application soumet une vidéo à POST /api/classify.
  2. Gaard accepte la tâche et la traite de manière asynchrone.
  3. Une fois la classification terminée et le résultat persisté, Gaard envoie une requête HTTP POST à chaque webhook configuré pour le flux.
  4. Votre endpoint reçoit la charge utile du résultat et peut déclencher des actions en aval telles que la création d’incident, l’enrichissement d’alarme ou l’archivage.

Dans l’application Gaard :

  1. Ouvrez la section des intégrations. Intégrations de la plateforme
  2. Créez une nouvelle intégration Webhook.
  3. Sélectionnez le flux qui doit déclencher le webhook.
  4. Saisissez l’URL de destination de votre récepteur.
  5. Enregistrez l’intégration.
  6. Soumettez une classification de test et vérifiez que votre endpoint reçoit bien la charge utile.

Si vous devez envoyer le même résultat à plusieurs systèmes, créez plusieurs intégrations webhook.

Gaard envoie :

  • Méthode : POST
  • En-tête : Content-Type: application/json
  • Corps : JSON du résultat de classification

Gaard n’ajoute pas actuellement d’en-têtes d’authentification personnalisés ni d’en-tête de signature. Si votre récepteur nécessite une authentification, protégez-le à la périphérie, par exemple via un chemin d’URL secret, un reverse proxy ou tout autre mécanisme sous votre contrôle.

Classify WebHook payload
{
"id": "6662f5c1f897618de43f0bbd",
"status": {
"classify": "done",
"video": "done"
},
"parent_id": "000000000000000000000000",
"camera_id": "134188-VI08",
"analyse_id": 3373550353,
"tenant": "tenant",
"duration": 2968236,
"duration_seconds": 2,
"model": "noname",
"version": "2.0.16123",
"error_code": 0,
"error_msg": "",
"risk": "intrusion",
"labels": ["intrusion", "person"],
"result": "classified",
"scores": {
"flag": 0.049,
"plant": 0.03,
"web": 0.009,
"NOTHING": 0.0005,
"intrusion": 0.973,
"person": 0.973,
"rain": 0.002,
"spider": 0.007,
"text": 0.0006,
"wind": 0.021,
"animal": 0.035,
"other": 0.028,
"vehicule": 0.101
},
"video": {
"videoname": "video.mov",
"filename": "video.mov",
"filesize": 786800,
"specs": {
"height": 320,
"original.width": 640,
"duration": 4.217772,
"fps": 3.08,
"nframes": 13,
"original.fps": 3,
"original.height": 360,
"original.nframes": 12,
"width": 568
}
},
"metadata": {
"camera_id": "VI08",
"site_id": 134188
},
"created_at": "2024-05-14T16:13:37.156+02:00",
"started_at": "2024-05-14T16:13:37.156+02:00"
}
ChampTypeNotes
idstringIdentifiant stable de classification. À utiliser comme clé principale de corrélation.
statusobjectÉtat final du traitement de la classification et de l’annotation vidéo.
camera_idstringIdentifiant de caméra dérivé des métadonnées.
analyse_idintIdentifiant d’analyse d’origine lorsqu’il est fourni par l’émetteur.
tenantstringTenant Gaard qui a produit le résultat.
riskstringRésultat de haut niveau tel que safe, danger ou intrusion.
labelsstring[]Labels dérivés de l’ensemble des scores.
resultstringChaîne brute du moteur, par exemple classified.
scoresobjectScores de confiance par label.
videoobjectNom, taille et specs techniques du fichier vidéo.
metadataobjectMétadonnées d’origine soumises avec la requête de classification.
created_atstringDate de création de la tâche de classification.
started_atstringDate de début du traitement.

Pour la référence complète des champs, voir Structure de la réponse et Résultat de classification.

La livraison du webhook est liée à la fin de la classification.

  • Gaard n’envoie pas le webhook lorsque la tâche n’est que simplement acceptée.
  • Gaard envoie le webhook après que le résultat de classification est stocké et le post-traitement terminé.
  • En pratique, le moment d’envoi du webhook est généralement très proche du moment où le résultat devient disponible via GET /api/result/{id}.

Il n’existe pas de file dédiée aux webhooks ni de fenêtre d’envoi par lot. La latence webhook de bout en bout est donc :

Σ(t) = classify + post-traitement + réseau

Gaard ne publie pas actuellement de SLA de latence webhook fixe, car la durée de classification dépend de la vidéo, du modèle, de la charge du runtime et de la distance réseau jusqu’à votre récepteur.

La livraison des webhooks fonctionne actuellement en mode « best effort ».

  • Gaard envoie un POST HTTP par endpoint webhook configuré.
  • Gaard n’implémente pas actuellement de réessais automatiques.
  • Gaard ne considère pas actuellement les réponses HTTP non 2xx comme des échecs de livraison à réessayer.

De ce fait, votre récepteur doit :

  • accepter la requête rapidement
  • renvoyer une réponse immédiatement après une validation de base
  • déplacer les traitements lourds vers une file interne ou un worker en arrière-plan
  • stocker l’id de la charge utile pour garantir l’idempotence

Pour rendre votre intégration robuste :

  • Acceptez les requêtes application/json.
  • Vérifiez que id, tenant et les champs dont vous dépendez sont bien présents.
  • Utilisez l’id de la charge utile comme clé de déduplication.
  • Traitez error_code != 0 comme un résultat terminé en erreur, et non comme un échec de transport.
  • Gardez votre endpoint webhook rapide et asynchrone.
  • Journalisez la charge utile complète lors du déploiement initial pour confirmer les champs de métadonnées présents dans votre environnement.

Votre endpoint peut renvoyer une réponse de succès minimale telle que :

HTTP/1.1 200 OK
Content-Type: application/json
{"ok":true}

Webhooks ou polling : quand utiliser chaque approche

Section intitulée « Webhooks ou polling : quand utiliser chaque approche »

Utilisez les webhooks lorsque :

  • vous souhaitez un traitement en aval quasi temps réel
  • vous exploitez déjà un service HTTP capable de recevoir des callbacks
  • vous souhaitez éviter le polling répété de la disponibilité du résultat

Utilisez le polling via GET /api/result/{id} lorsque :

  • les callbacks HTTP entrants ne sont pas possibles dans votre environnement
  • vous avez besoin d’un contrôle explicite sur le moment de la récupération
  • vous préférez une première intégration plus simple avant de passer à une livraison événementielle