Webhooks
Recevez une notification à la fin d’une exécution au lieu de la vérifier en boucle.
Enregistrez un point de terminaison une fois, puis transmettez son webhook_id lorsque vous lancez une exécution, et nous vous appelons lorsque cette exécution passe à un état auquel vous êtes abonné — généralement en moins d’une minute.
Enregistrer un point de terminaison
POST {base_url}/webhooks
{
"url": "https://hooks.example.com/morphic",
"events": ["workflow_run.succeeded", "workflow_run.failed"],
"description": "pipeline d’histoires"
}Nécessite runs:write. L’URL doit être publique https sans identifiants intégrés ; une organisation peut avoir jusqu’à 10 points de terminaison.
La 201 réponse contient le id — transmettez-le comme webhook_id sur une exécution — et son secret de signature (whsec_…), affiché une seule fois. Conservez-le comme vous le feriez pour la clé d’API.
GET {base_url}/webhooks
DELETE {base_url}/webhooks/{webhook_id}GET (runs:read) liste vos points de terminaison, jamais leurs secrets. DELETE (runs:write) en supprime un ; les livraisons encore en attente pour celui-ci sont abandonnées. Pour faire tourner un secret, enregistrez un nouveau point de terminaison et transférez-y vos exécutions.
Événements
| Événement | Se déclenche lorsque |
|---|---|
workflow_run.succeeded | l’exécution est terminée ; ses ressources sont prêtes |
workflow_run.failed | l’exécution s’est arrêtée ; erreur explique pourquoi |
workflow_run.needs_input | l’exécution attend une personne dans Morphic Studio |
workflow_run.expired | l’exécution ne s’est jamais terminée pendant sa durée de vie |
La livraison
POST https://hooks.example.com/morphic
Morphic-Event-Id: 0192f4a0-3c71-7b92-8e14-5d6f2a9b3c07
Morphic-Delivery-Id: 0192f4a0-4d82-7c03-9f25-6e7a3b0c4d18
Morphic-Event-Type: workflow_run.succeeded
Morphic-Signature: t=1790056632,v1=3f9c1a…
{
"id": "0192f4a0-3c71-7b92-8e14-5d6f2a9b3c07",
"type": "workflow_run.succeeded",
"created_at": "2026-09-22T04:17:12Z",
"api_version": "v1",
"data": {
"run": { "id": "0192f3d0-…", "status": "succeeded", "assets": [], "credits_used": 1792 }
}
}La exécution l’objet a la même structure Lire une exécution de workflow renvoie, ressources inclus — ainsi, une livraison réussie n’a besoin d’aucun appel de suivi. Il s’agit de l’exécution telle qu’elle était au moment où l’événement a été déclenché, et ses liens vers les ressources restent valides pendant environ un jour, tant que les tentatives de livraison continuent.
Vérifiez chaque livraison
Calculez un HMAC-SHA256 de {timestamp}.{corps brut} avec votre secret de signature et comparez-le à v1 en temps constant. Utilisez le brut corps, avant tout parsing JSON.
import crypto from 'node:crypto';
function verify({ rawBody, header, secret }) {
const parts = Object.fromEntries(
header.split(',').map((pair) => pair.split('=')),
);
const expected = crypto
.createHmac('sha256', secret)
.update(`${parts.t}.${rawBody}`)
.digest('hex');
const signed = Buffer.from(expected);
const given = Buffer.from(parts.v1);
if (signed.length !== given.length) return false;
if (!crypto.timingSafeEqual(signed, given)) return false;
// Refusez une livraison rejouée.
return Math.abs(Date.now() / 1000 - Number(parts.t)) < 300;
}Un point de terminaison webhook non vérifié est une porte ouverte : quiconque connaît l’URL peut vous dire qu’une exécution a réussi. Vérifiez la signature et rejetez un horodatage plus ancien que cinq minutes.
Réessais et ordre
- Répondez
2xxen 10 secondes. Accusez réception d’abord, puis faites le travail — un gestionnaire lent est considéré comme un échec. - Un non-
2xxou un délai d’attente est réessayé avec un backoff exponentiel pendant environ un jour, puis abandonné. Une redirection n’est pas suivie et est considérée comme un échec. - Seuls les événements auxquels un point de terminaison est abonné sont envoyés ; une exécution qui atteint un autre état ne signale rien pour celui-ci.
- Les livraisons peuvent arriver dans le désordre et plus d’une fois. Basez-vous sur
Morphic-Event-Idet ignorez-en une que vous avez déjà traitée. - Une
réussielivraison peut arriver avant que votre propre enregistrement de l’exécution n’existe. Gérez cela plutôt que de produire une erreur — ou revenez au sondage pour ces exécutions.
Les webhooks sont une optimisation, pas une garantie. Conservez une vérification lente qui interroge les exécutions dont vous n’avez pas entendu parler, afin qu’un seul mauvais déploiement de votre côté ne fasse pas perdre la production d’une journée.