Traduction automatique
Cette page a été traduite par IA. La version anglaise fait foi.
Webhooks¶
Au lieu d'interroger l'API, enregistrez un point d'accès https et Hi, Moose y envoie un événement JSON signé quand une analyse se termine. Enregistrer, tester et supprimer des webhooks nécessite la permission gérer le suivi. Les lister, ainsi que leurs livraisons, ne demande que la lecture.
Points d'accès¶
| Point d'accès | Ce qu'il fait |
|---|---|
POST /projects/{id}/webhooks | Enregistrer un point d'accès. Corps : url (https public), events (par défaut run.completed et run.failed), description facultative. Le secret de signature revient une seule fois dans cette réponse. Au plus 5 par projet. |
GET /projects/{id}/webhooks | Lister les webhooks du projet, sans les secrets |
DELETE /projects/{id}/webhooks/{webhookId} | En supprimer un |
POST /projects/{id}/webhooks/{webhookId}/test | Envoyer un événement ping maintenant, pour vérifier votre point d'accès et votre code de signature |
GET /projects/{id}/webhooks/{webhookId}/deliveries | Les 50 dernières livraisons avec chaque tentative, statut et erreur |
En enregistrer un¶
curl -X POST https://api.himoose.com/v1/projects/PROJECT_ID/webhooks \
-H "Authorization: Bearer hmk_live_..." -H "Content-Type: application/json" \
-d '{"url":"https://reports.acme.example/himoose","description":"Nightly dashboard refresh"}'
{
"id": "BGXhe1dlOnmy36j6rRTa",
"url": "https://reports.acme.example/himoose",
"events": ["run.completed", "run.failed"],
"description": "Nightly dashboard refresh",
"active": true,
"createdAt": "2026-10-15T03:20:10.000Z",
"secret": "whsec_..."
}
Stockez secret à côté de votre clé. Il ne s'affiche que dans cette réponse. L'URL doit être publique et en https ; les adresses privées, localhost et le http simple sont refusés avec 400 invalid_parameter.
Envoyez-vous ensuite un ping :
curl -X POST https://api.himoose.com/v1/projects/PROJECT_ID/webhooks/WEBHOOK_ID/test \
-H "Authorization: Bearer hmk_live_..."
La réponse est l'enregistrement de livraison, et le point d'accès deliveries montre la tentative avec le statut HTTP renvoyé par votre point d'accès.
L'événement¶
{
"id": "wh_8f2a_run_abc123_run_completed",
"event": "run.completed",
"createdAt": "2026-10-12T09:14:03.000Z",
"data": {
"projectId": "abc123",
"runId": "run_abc123",
"requestId": "req_9d1e",
"status": "completed",
"trigger": "manual",
"startedAt": "2026-10-12T09:01:10.000Z",
"completedAt": "2026-10-12T09:14:02.000Z",
"promptCount": 40,
"answerCount": 118,
"error": null,
"links": {
"run": "https://api.himoose.com/v1/projects/abc123/runs",
"answers": "https://api.himoose.com/v1/projects/abc123/answers?runId=run_abc123",
"stats": "https://api.himoose.com/v1/projects/abc123/stats/daily"
}
}
}
| Événement | Quand |
|---|---|
run.completed | Une analyse s'est terminée et ses réponses sont enregistrées. Les analyses planifiées, celles du bouton Lancer maintenant et celles de l'API comptent toutes. |
run.failed | Une analyse s'est terminée avec status failed ou canceled. data.error dit pourquoi. |
ping | Envoyé par le point d'accès de test. data porte l'identifiant du projet et un message. |
data.requestId est renseigné quand l'analyse a été lancée par l'API, pour relier l'événement à votre demande d'analyse. Il vaut null pour les analyses planifiées et celles lancées dans Hi, Moose.
L'événement est un signal, pas les données. Sur run.completed, suivez data.links.answers ou rafraîchissez vos statistiques quotidiennes. Les résumés quotidiens des jours de l'analyse sont reconstruits dans les dix minutes suivant sa fin ; incompleteDays dans la réponse des statistiques indique quand ils ne sont pas encore prêts.
En-têtes¶
| En-tête | Valeur |
|---|---|
X-HiMoose-Signature | t=<unix seconds>,v1=<hex>, voir plus bas |
X-HiMoose-Event | Le nom de l'événement |
X-HiMoose-Delivery | L'identifiant de livraison, le même que sur le point d'accès deliveries |
User-Agent | HiMoose-Webhooks/1.0 |
Content-Type | application/json |
Vérifier la signature¶
v1 est le HMAC-SHA256 de <t>.<raw body> avec le secret de votre webhook, en hexadécimal minuscule. Vérifiez-le sur le corps brut de la requête avant d'analyser le JSON, comparez en temps constant et rejetez les horodatages de plus de cinq minutes.
const crypto = require("node:crypto");
function verifyHiMooseSignature(rawBody, header, secret) {
const parts = Object.fromEntries(header.split(",").map((part) => part.split("=")));
if (!parts.t || !parts.v1) return false;
if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false;
const expected = crypto.createHmac("sha256", secret).update(`${parts.t}.${rawBody}`).digest("hex");
return expected.length === parts.v1.length && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}
import hashlib
import hmac
import time
def verify_himoose_signature(raw_body: bytes, header: str, secret: str) -> bool:
parts = dict(part.split("=", 1) for part in header.split(",") if "=" in part)
if "t" not in parts or "v1" not in parts:
return False
if abs(time.time() - int(parts["t"])) > 300:
return False
expected = hmac.new(secret.encode(), f"{parts['t']}.".encode() + raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, parts["v1"])
La plupart des frameworks web analysent le JSON avant que votre code s'exécute. Assurez-vous de signer les octets tels que reçus, pas une copie resérialisée, sinon la signature ne correspondra pas.
Règles de livraison¶
- Répondez avec un statut 2xx sous 10 secondes. Faites le travail après avoir répondu, pas avant. Les redirections ne sont pas suivies.
- Les livraisons échouées sont retentées après 1 minute, 5 minutes, 30 minutes, 2 heures et 12 heures, 6 tentatives en tout. Une livraison est
pendingtant qu'il reste des tentatives,deliveredaprès un 2xx,failedaprès la dernière tentative. - Après 20 échecs consécutifs, le webhook est désactivé,
activepasse à false et plus aucun événement n'est envoyé. Supprimez-le et enregistrez-le à nouveau pour reprendre. - Un événement peut arriver plus d'une fois. Utilisez
idpour ignorer les répétitions. - Les événements d'un même projet peuvent arriver dans le désordre quand une nouvelle tentative intervient. Utilisez
createdAtsi l'ordre compte.
Voir les livraisons¶
curl https://api.himoose.com/v1/projects/PROJECT_ID/webhooks/WEBHOOK_ID/deliveries \
-H "Authorization: Bearer hmk_live_..."
Chaque livraison liste chaque tentative avec son heure, le statut HTTP renvoyé par votre point d'accès, sa durée et l'erreur éventuelle. Quand un point d'accès se comporte mal, c'est le premier endroit où regarder.
Le propriétaire du compte voit tous les webhooks du projet courant sous Paramètres → Hi, Moose REST API avec le statut de leur dernière livraison, et peut en supprimer un là.