S'abonner aux webhooks
Soyez notifié lorsque des événements majeurs se produisent, sans interrogation périodique.
Les sessions sont des interactions de longue durée. Alors que la plupart des interactions en temps réel passent par le flux d'événements SSE, les « webhooks » (rappels HTTP) vous notifient des changements d'état majeurs.
Les événements de webhook renvoient le type et l'id de l'événement, et non l'objet complet. Lorsque vous recevez un événement de webhook, vous devez récupérer l'objet directement avec un appel GET. Cela évite de livrer des données obsolètes lors des nouvelles tentatives et permet de garder chaque livraison légère.
Types d'événements pris en charge
Certains de ces événements portent un nom différent de celui des événements correspondants du flux d'événements de la session. Par exemple, les événements session.status_idle et session.status_running du flux correspondent aux événements de webhook session.status_idled et session.status_run_started.
| Événement | Déclencheur |
|---|---|
session.status_run_started | L'exécution de l'agent a démarré. Cet événement se déclenche à chaque transition du statut de la session vers running. |
session.status_idled | L'agent attend une entrée, par exemple une approbation d'autorisation d'outil ou un nouveau message utilisateur. |
session.budget_reached | La session a atteint son budget et s'est mise en pause. Se déclenche au plus une fois pour chaque valeur de budget que vous définissez ; modifier le budget le réarme. |
session.status_rescheduled | Une erreur transitoire s'est produite et la session effectue automatiquement une nouvelle tentative. |
session.status_terminated | La session s'est terminée, soit en raison d'une erreur irrécupérable, soit parce qu'elle a été archivée. |
session.thread_created | Un nouveau fil multiagent a été ouvert : un agent supplémentaire appelé par l'agent exécuté par la session commence son travail, ou le conseiller de la session est consulté. Il se déclenche également pour chaque fil d'une exécution de workflow, tout comme les deux autres événements de fil de ce tableau. |
session.thread_idled | Un agent dans une interaction multiagent attend une entrée. |
session.thread_terminated | Un fil multiagent s'est terminé, soit parce que le fil a été archivé, soit parce qu'il a épuisé ses nouvelles tentatives. Un sous-agent qui termine son travail passe à idle, et non à terminated (un fil de conseiller se termine une fois sa consultation achevée, et les fils d'une exécution de workflow se terminent lorsque le serveur les archive, à la fin de l'exécution). Se déclenche uniquement pour les fils enfants ; la fin du fil principal, y compris l'archivage de la session entière, n'apparaît que sous la forme de session.status_terminated. |
session.outcome_evaluation_ended | L'évaluation du résultat pour une seule itération est terminée. |
session.updated | Les propriétés de la session ont changé (par exemple, son nom ou sa configuration a été mis à jour). |
session.deleted | Session supprimée définitivement. Il n'y a plus d'objet à récupérer, considérez donc l'événement lui-même comme définitif. |
| Événement | Déclencheur |
|---|---|
vault.created | Coffre créé. |
vault.archived | Coffre archivé. Un événement vault_credential.archived est également émis pour chaque identifiant sous-jacent. |
vault.deleted | Coffre supprimé. Un événement vault_credential.deleted est également émis pour chaque identifiant sous-jacent. Il n'y a plus d'objet à récupérer, considérez donc l'événement lui-même comme définitif. |
vault_credential.created | Identifiant créé. |
vault_credential.archived | Identifiant archivé, soit directement, soit à la suite de l'archivage du coffre. |
vault_credential.deleted | Identifiant supprimé, soit directement, soit à la suite de la suppression du coffre. Il n'y a plus d'objet à récupérer, considérez donc l'événement lui-même comme définitif. |
vault_credential.refresh_failed | Un identifiant mcp_oauth ne peut pas être actualisé (jeton d'actualisation invalide, ou erreur irrécupérable du serveur OAuth). |
Ces événements suivent le cycle de vie des ressources d'agent dans votre espace de travail, et sont distincts des événements d'agent livrés sur le flux d'événements d'une session.
| Événement | Déclencheur |
|---|---|
agent.created | Agent créé. |
agent.updated | Une nouvelle version de l'agent a été publiée. Les mises à jour qui ne créent pas de nouvelle version ne déclenchent pas cet événement. |
agent.archived | Agent archivé. |
agent.deleted | Agent supprimé définitivement. Il n'y a plus d'objet à récupérer, considérez donc l'événement lui-même comme définitif. |
| Événement | Déclencheur |
|---|---|
deployment.created | Déploiement planifié créé. |
deployment.updated | Les propriétés du déploiement ont changé (par exemple, sa planification a été mise à jour). |
deployment.paused | Déploiement mis en pause, soit sur demande, soit automatiquement lorsqu'une exécution planifiée échoue avec une erreur irrécupérable, comme un sous-agent archivé ou un environnement archivé. Les échecs récupérables, y compris les limites de débit, ne mettent pas le déploiement en pause. Consultez Comportement en cas d'échec. |
deployment.unpaused | Déploiement réactivé, reprenant sa planification. |
deployment.archived | Déploiement archivé, soit directement, soit parce que son agent a été archivé. Si l'agent est plutôt supprimé, un déploiement planifié est archivé lors de sa prochaine exécution planifiée ; un déploiement sans planification n'est pas archivé automatiquement. |
deployment.deleted | Déploiement supprimé définitivement. Il n'y a plus d'objet à récupérer, considérez donc l'événement lui-même comme définitif. |
| Événement | Déclencheur |
|---|---|
deployment_run.started | Une exécution planifiée a démarré. Seules les exécutions planifiées émettent des événements deployment_run ; les exécutions manuelles n'en émettent pas. |
deployment_run.succeeded | Une exécution planifiée a créé sa session. L'événement porte le même data.id (l'ID de l'exécution) que l'événement deployment_run.started de l'exécution. Pour suivre le travail de la session, abonnez-vous à ses événements de session (l'onglet Événements de session), ou récupérez l'exécution de déploiement pour obtenir son session_id. |
deployment_run.failed | Une exécution planifiée n'a pas créé de session. L'événement porte le même data.id que l'événement deployment_run.started de l'exécution. Récupérez l'exécution de déploiement pour obtenir les détails de l'erreur. |
| Événement | Déclencheur |
|---|---|
environment.created | Environnement créé. |
environment.updated | Environnement mis à jour avec au moins un champ modifié. Une mise à jour sans effet n'émet rien. |
environment.archived | Environnement archivé. Archiver à nouveau un environnement déjà archivé n'émet rien. |
environment.deleted | Environnement supprimé, y compris la suppression d'un environnement déjà archivé. Il n'y a plus d'objet à récupérer, considérez donc l'événement lui-même comme définitif. |
Les éléments de travail d'un environnement n'émettent aucun événement de webhook.
| Événement | Déclencheur |
|---|---|
memory_store.created | Magasin de mémoire créé, soit par vous, soit par un processus opéré par Anthropic qui clone l'un de vos magasins existants. |
memory_store.archived | Magasin de mémoire archivé. Archiver à nouveau un magasin déjà archivé n'émet rien. |
memory_store.deleted | Magasin de mémoire supprimé, y compris la suppression d'un magasin déjà archivé. La suppression d'un magasin se propage en cascade à ses mémoires et versions de mémoire sans émettre d'événements par mémoire ; l'unique événement memory_store.deleted constitue le signal. Il n'y a plus d'objet à récupérer, considérez donc l'événement lui-même comme définitif. |
Les mémoires individuelles et les versions de mémoire n'émettent aucun événement de webhook.
Enregistrer un point de terminaison
Dans la Claude Console, accédez à la page Webhooks (platform.claude.com/settings/workspaces/default/webhooks). Chaque point de terminaison appartient à un espace de travail. Sélectionnez l'espace de travail souhaité dans le sélecteur d'espace de travail de la barre latérale.
Un « endpoint » (point de terminaison) de webhook se compose de :
- URL : Doit être en HTTPS sur le port 443 avec un nom d'hôte résolvable publiquement.
- Types d'événements : La liste des valeurs
data.typeque ce point de terminaison reçoit. Un point de terminaison ne reçoit que les événements auxquels il est abonné. - Secret de signature : Un secret de 32 octets préfixé par
whsec_généré lors de la création. Il n'est affiché qu'une seule fois, stockez-le donc de manière sécurisée pour vérifier les livraisons de webhook.
Vérifier la signature
Chaque livraison comporte les en-têtes webhook-id, webhook-timestamp et webhook-signature. Utilisez l'assistant unwrap() du SDK pour vérifier la signature et analyser l'événement en une seule étape. Il lève une exception si la signature est invalide ou si la charge utile date de plus de 5 minutes.
Définissez ANTHROPIC_WEBHOOK_SIGNING_KEY sur le secret préfixé par whsec_ affiché lors de la création du point de terminaison.
from flask import Flask, request
import anthropic
client = anthropic.Anthropic() # reads ANTHROPIC_WEBHOOK_SIGNING_KEY from env
app = Flask(__name__)
@app.route("/webhook", methods=["POST"])
def webhook():
try:
# unwrap() lève une exception si la signature est invalide ou si la charge utile est périmée.
event = client.beta.webhooks.unwrap(
request.get_data(as_text=True),
headers=dict(request.headers),
)
except Exception:
return "invalid signature", 400
if event.data.type == "session.status_idled":
print("session idled:", event.data.id)
# gérer les autres types d'événements
return "", 200Traiter un événement
Analysez le corps, effectuez un branchement sur data.type et récupérez la ressource par son ID. Renvoyez n'importe quel code 2xx pour accuser réception. Toute autre réponse est comptabilisée contre le point de terminaison : un 3xx le désactive immédiatement (les redirections ne sont jamais suivies), tandis que les autres échecs font l'objet de nouvelles tentatives ; consultez Comportement de livraison pour les règles de nouvelle tentative et de désactivation automatique.
Chaque charge utile d'événement a la même structure, incluant le type d'événement, l'identifiant et l'horodatage du moment où l'événement s'est produit.
{
"type": "event",
"id": "whe_9d5c1f7e...",
"created_at": "2026-03-18T14:05:22Z",
"data": {
"type": "session.status_idled",
"id": "sesn_01XYZ...",
"organization_id": "8a3d2f1e-...",
"workspace_id": "c7b0e4d9-..."
}
}if event.data.type == "session.status_idled":
session = client.beta.sessions.retrieve(event.data.id)
notify_user(session)
return "", 204Le event.id de niveau supérieur est unique par événement, et non par livraison. Si vous recevez deux fois le même event.id, il s'agit d'une nouvelle tentative et vous pouvez l'ignorer.
Comportement de livraison
-
Doublons : Un point de terminaison peut recevoir le même événement plus d'une fois, et chaque tentative livre le même
event.idde niveau supérieur (la même valeur que l'en-têtewebhook-id). Dédupliquez sur cette valeur. -
Portée de l'abonnement : Un événement n'est livré qu'aux points de terminaison abonnés à son type au moment où il est émis. Un événement émis alors qu'aucun point de terminaison n'est abonné à son type n'est jamais livré, et un abonnement ultérieur ne le rattrape pas ; abonnez-vous donc à un type d'événement avant d'en avoir besoin.
-
L'ordre n'est pas garanti. Les événements ne sont pas livrés dans l'ordre où ils se sont produits :
session.status_idledpeut arriver avantsession.outcome_evaluation_endedmême si le résultat a été produit en premier, et un événement.deletedpeut arriver avant l'événement.archivedpour la même ressource. Pilotez votre état à partir de la ressource que vous récupérez, et non de l'ordre d'arrivée des événements. -
Nouvelles tentatives : Pour chaque point de terminaison et chaque événement, Anthropic effectue jusqu'à trois tentatives de livraison (une réponse qui déclenche la désactivation automatique, décrite plus loin dans cette section, ne fait jamais l'objet d'une nouvelle tentative) avec un « exponential backoff » (délai exponentiel) avec gigue compris entre 5 et 120 secondes. Chaque tentative livre le même
event.id. Après l'échec de la dernière tentative, l'événement est abandonné : il n'est pas mis en file d'attente pour une livraison ultérieure et aucun signal n'indique qu'il a été perdu. Les webhooks ne constituent pas un journal durable ; si vous devez observer chaque transition, effectuez un rapprochement en listant ou en récupérant la ressource via l'API. -
Horodatages : L'en-tête
webhook-timestampest apposé lorsqu'une tentative de livraison est signée et est régénéré à chaque nouvelle tentative, de sorte que les nouvelles tentatives ne sont pas rejetées par la vérification de fraîcheur du SDK. Il s'agit de l'horloge de la tentative de livraison, et non de l'événement : utilisez le champcreated_atde la charge utile de l'événement pour connaître le moment où l'événement s'est produit. -
Désactivation automatique : Un point de terminaison est automatiquement défini sur
disabledavec undisabled_reasonlisible par machine dans trois cas :- Le point de terminaison renvoie une réponse
3xx. Les redirections ne sont jamais suivies ; cela désactive le point de terminaison immédiatement, dès la première tentative, avec la raisonauto-disabled: endpoint URL returned a redirect (3xx). Si votre point de terminaison change d'adresse, mettez à jour l'URL dans la Console et réactivez le point de terminaison. - L'URL du point de terminaison se résout en une adresse IP non publique lorsque Anthropic s'y connecte. Cela désactive le point de terminaison immédiatement, avec la raison
auto-disabled: endpoint URL resolved to an invalid address. - Les livraisons vers le point de terminaison échouent continuellement pendant une période prolongée, avec la raison
auto-disabled after sustained delivery failures. Le déclencheur est la durée pendant laquelle le point de terminaison échoue sans interruption, et non un nombre de livraisons. Un seul2xxréinitialise la fenêtre, de sorte qu'un événement instable ne peut pas désactiver le point de terminaison.
Ces trois cas sont réversibles : réactivez le point de terminaison dans la Console après avoir résolu le problème. Les événements émis pendant que le point de terminaison était désactivé ne sont pas rejoués.
- Le point de terminaison renvoie une réponse
Was this page helpful?