Webhook
Dernière mise à jour : 22 juin 2026
Un Webhook est une configuration qui envoie une requête HTTP vers une URL externe prédéfinie lorsqu'un événement se produit dans un Space (par exemple, la création ou la publication d'un Content). Il sert à intégrer des systèmes externes ou à automatiser des tâches. Par exemple, vous pouvez le configurer pour appeler un serveur de notification interne ou une API externe chaque fois qu'un Content de produit est publié.
Un Webhook ne se limite pas à envoyer une requête : il peut aussi configurer un WriteBack qui reçoit la réponse et la réécrit dans un Content ou un Media. C'est ainsi que vous construisez un flux de travail asynchrone qui absorbe le résultat d'une API externe sous forme de données à l'intérieur du Space. Le Webhook est une ressource enfant du Space dans CMA, et son chemin repose sur /spaces/{spaceId}/webhooks.
Structure de la ressource
Voici la réponse d'une consultation unitaire du Webhook « Notification de modification de produit ». Outre sys (propriétés système), il comporte des champs de configuration comme la cible d'envoi, les événements souscrits et les conditions de déclenchement.
{
"sys": {
"id": "3trmXRM3RqbgSnifyg7PWhk01Examp",
"type": "Webhook",
"space": { "sys": { "id": "HnQ32YiH", "type": "Refer", "targetType": "Space" } },
"createdBy": { "sys": { "id": "3p4tcFbQRwz503VXdtHXNI5dZH5TVB", "type": "Refer", "targetType": "User" } },
"createdAt": "2026-06-18T11:30:00.000Z",
"updatedBy": { "sys": { "id": "3p4tcFbQRwz503VXdtHXNI5dZH5TVB", "type": "Refer", "targetType": "User" } },
"updatedAt": "2026-06-18T11:30:00.000Z",
"version": 1
},
"name": "Notification de modification de produit",
"filters": [
{ "doc": "sys.contentType.sys.id", "op": "EQ", "value": "3trmXRLdJF4GBlAjtcuoZ7Pnxj8dlA" }
],
"headers": [
{ "key": "X-Source", "value": "weegloo", "secret": false }
],
"httpBasicUsername": "dailywear",
"topics": ["Content.Create", "Content.Publish"],
"transformation": { "method": "POST", "contentType": "application/json", "includeBody": true },
"url": "https://api.dailywear.example/webhooks/products",
"activate": true
}Clés principales :
sys.id: identifiant unique du Webhook. Il s'insère dans le{webhookId}des chemins de consultation unitaire, de modification et de suppression.url: URL externe cible à appeler lorsqu'un événement se produit.topics: tableau qui détermine les événements à souscrire. La section topics ci-dessous en décrit le format.filters: conditions qui déclenchent réellement parmi les événements souscrits. Décrites dans filters ci-dessous.transformation: configuration qui modifie la forme (méthode, corps, etc.) de la requête sortante. Décrite dans transformation ci-dessous.writeBacks: tableau d'opérations qui reçoivent la réponse externe et la réécrivent dans un Content ou un Media. Il est absent de l'exemple ci-dessus. Décrit dans writeBacks ci-dessous.
Propriétés système (sys)
Chaque Webhook place ses propriétés système communes dans l'objet sys. Les champs space, createdBy et updatedBy se présentent sous la forme Refer ({ "sys": { "id", "type": "Refer", "targetType" } }).
| Propriété | Type | Description |
|---|---|---|
id | string | Identifiant unique de la ressource. |
type | string | Type de ressource. Pour un Webhook, toujours "Webhook". |
space | Refer<Space> | Le Space auquel appartient ce Webhook. |
createdBy | Refer<User> | Utilisateur qui a créé la ressource. |
createdAt | string (date-time) | Date et heure de création. |
updatedBy | Refer<User> | Dernier utilisateur ayant modifié la ressource. |
updatedAt | string (date-time) | Date et heure de la dernière modification. |
version | integer (≥1) | Version de la ressource. Augmente de 1 à chaque modification. |
Le Webhook étant une ressource de configuration, il n'a pas de notion de publication. Contrairement à un Content ou à un Content Type, il ne possède pas de propriétés d'état de publication telles que publish, archive ou status ; il n'a que version pour le suivi des modifications. Son activation et sa désactivation ne se contrôlent pas par la publication, mais par le champ de corps activate.
Propriétés du corps
Le corps du Webhook (les valeurs de configuration envoyées lors de la création ou de la modification et renvoyées dans la réponse) se compose des champs suivants.
| Champ | Type | Requis | Description |
|---|---|---|---|
name | string (1~64) | ✅ | Nom du Webhook. |
url | string (url) | ✅ | URL externe cible à appeler lorsqu'un événement se produit. |
activate | boolean | ✅ | Indique s'il est activé. Si false, aucune requête n'est envoyée même lorsqu'un événement se produit. |
topics | string[] | ✅ | Tableau des événements à souscrire. Voir topics ci-dessous. |
filters | Filter[] | ✅ | Tableau des conditions de déclenchement. Si vide, tous les événements souscrits déclenchent. Voir filters ci-dessous. |
headers | WebhookHeader[] (0~30) | ✅ | Tableau des en-têtes HTTP à joindre à la requête. |
httpBasicUsername | string (1~32) | Nom d'utilisateur pour l'authentification HTTP Basic. | |
httpBasicPassword | string (1~32) | Mot de passe pour l'authentification HTTP Basic. En écriture seule. N'apparaît pas dans la réponse. | |
transformation | Transformation | ✅ | Personnalisation de la requête sortante. Voir transformation ci-dessous. |
writeBacks | WriteBack[] | Tableau des opérations d'écriture à exécuter à la réception de la réponse. Voir writeBacks ci-dessous. |
Chaque élément de headers se compose de key (requis), value (requis) et secret (facultatif, boolean). La valeur d'un en-tête dont secret vaut true est masquée dans la réponse. Placez les valeurs qui ne doivent pas être exposées, comme une clé d'API, dans un en-tête secret: true.
topics
Chaque élément de topics suit le format {ressource}.{action}. Par exemple : Content.Create, Content.Publish, Media.Create.
L'action est l'une des suivantes, ou bien *, qui désigne toutes les actions de la ressource (par exemple Content.*).
| Action | Signification |
|---|---|
All | Toutes les actions. |
Create | Création. |
Read | Consultation. |
Edit | Édition. |
Save | Enregistrement (modification). L'événement de modification est Save. Ce n'est pas Update. |
Delete | Suppression. |
Publish | Publication. |
Unpublish | Dépublication. |
Archive | Archivage. |
Unarchive | Désarchivage. |
filters
filters est un tableau qui restreint, parmi les topics souscrits, les conditions qui déclencheront réellement le Webhook. Chaque filtre a la forme suivante.
{ "doc": "sys.contentType.sys.id", "op": "EQ", "value": "3trmXRLdJF4GBlAjtcuoZ7Pnxj8dlA" }doc: chemin du champ à comparer. L'une des valeurssys.id,sys.contentType.sys.id,sys.createdBy.sys.idousys.updatedBy.sys.id.op: opérateur de comparaison. L'une des valeursEQ,NE,IN,NOT_IN,REGEXouNOT_REGEX.value: valeur de comparaison. Une chaîne pourEQ,NE,REGEXetNOT_REGEX; un tableau de chaînes pourINetNOT_IN.
Si vous définissez plusieurs filtres, ils doivent tous être satisfaits pour déclencher (AND). Si filters est vide, tous les événements des topics souscrits déclenchent.
transformation
transformation modifie la forme de la requête HTTP sortante. Si elle n'est pas spécifiée, l'intégralité de la charge utile de la ressource part telle quelle avec la méthode POST par défaut.
| Clé | Type | Description |
|---|---|---|
method | string | Méthode HTTP. L'une des valeurs GET, POST, PUT, DELETE ou PATCH. |
contentType | string | Content-Type du corps de la requête. |
body | object | Objet qui compose le corps à envoyer au moyen de modèles JSON Pointer. |
includeBody | boolean | Indique si le corps de la ressource déclencheuse est envoyé avec la requête. |
writeBacks
writeBacks est un tableau ordonné d'opérations qui, à partir de la réponse externe reçue par le Webhook, réécrivent dans un Content ou un Media. Elles ne s'exécutent dans l'ordre que si l'API externe a répondu avec un code 2xx. Chaque élément contient soit $content (WriteBackContent), soit $media (WriteBackMedia).
Clés de WriteBackContent ($content) :
| Clé | Type | Description |
|---|---|---|
action | string | L'une des valeurs Create, Update, Delete, Publish, Unpublish, Archive ou Unarchive. |
contentType | Refer<ContentType> | Le Content Type à créer lors de l'action Create. Il suffit de fournir le sys.id. |
target | string | Modèle JSON Pointer désignant le sys.id du Content cible pour Update, Delete, etc. (par exemple { /response/id }). Il doit être entouré de { } ; sinon, il est traité comme une valeur littérale. S'il est omis, la ressource ayant déclenché le Webhook est prise pour cible. |
locale | string | Locale dans laquelle écrire les valeurs lors de Create et Update. Code de locale ou modèle de pointeur. S'il est omis, la locale par défaut du Space. |
fields | object | Mappage clé de champ cible → expression source lors de Create et Update. La clé est l'apiName du champ du Content cible. |
publish | boolean | Indique s'il faut publier après Create ou Update. Valeur par défaut : true. |
unpublish | boolean | Indique s'il faut dépublier avant la suppression lors de Delete. Valeur par défaut : true. |
Clés de WriteBackMedia ($media) :
| Clé | Type | Description |
|---|---|---|
action | string | L'une des valeurs Create, Delete, Publish, Unpublish, Archive ou Unarchive. |
source | string | Modèle de pointeur de la valeur à importer dans le Media lors de Create (par exemple { /response/data/0/url }). Il doit être entouré de { }. |
encoding | string | Manière d'interpréter source lors de Create. L'une des valeurs Url, Base64 ou Binary. |
locale | string | Locale dans laquelle écrire le fichier, le titre et la description lors de Create. Si elle est omise, la locale par défaut du Space. |
title | string | Titre du Media lors de Create (expression source ou valeur littérale). |
description | string | Description du Media lors de Create. |
target | string | Modèle de pointeur désignant le sys.id du Media cible pour Delete, etc. S'il est omis, la ressource déclencheuse est la cible. |
publish | boolean | Indique s'il faut publier une fois le traitement terminé lors de Create. Valeur par défaut : true. |
unpublish | boolean | Indique s'il faut dépublier avant la suppression lors de Delete. Valeur par défaut : true. |
Voici un exemple de writeBacks qui extrait des valeurs du JSON de la réponse externe pour créer un Content.
"writeBacks": [
{
"$content": {
"action": "Create",
"contentType": { "sys": { "id": "3trmXRLdJF4GBlAjtcuoZ7Pnxj8dlA" } },
"locale": "ko-KR",
"fields": {
"productName": "{ /response/title }",
"price": "{ /response/price }"
},
"publish": true,
"unpublish": true
}
}
]{ /response/... } est un modèle JSON Pointer qui extrait une valeur du JSON de la réponse reçue par le Webhook. Les clés de fields (productName, price) sont l'apiName des champs du Content cible. L'exemple ci-dessus place le title de la réponse dans le productName du Content et le price dans price, crée le Content, puis le publie.
API
L'URL de référence de tous les endpoints ci-dessous est https://cma.weegloo.com/v1, et un jeton Bearer authentifiant auprès de CMA est requis dans l'en-tête Authorization. La modification (PUT) et la modification partielle (PATCH) doivent inclure l'en-tête X-Weegloo-Version (le sys.version actuel de la ressource) pour le contrôle de concurrence optimiste.
