Webhook

Última actualización: 22 de junio de 2026

Un Webhook es una configuración que envía una petición HTTP a una URL externa predefinida cuando ocurre un evento en un Space (por ejemplo, la creación o publicación de un Content). Se usa para integraciones con sistemas externos o para automatización. Por ejemplo, puede configurarse para llamar a un servidor de notificaciones interno cada vez que se publica un Content de producto, o para invocar una API externa.

Un Webhook no se limita a enviar la petición: también puede configurar un WriteBack que reciba la respuesta y la vuelva a escribir en un Content o un Media. Así se construye un flujo de trabajo asíncrono que absorbe el resultado de una API externa como datos dentro del Space. El Webhook es un recurso hijo de Space en CMA, y su ruta se basa en /spaces/{spaceId}/webhooks.

Estructura del recurso

A continuación se muestra la respuesta de consulta individual del Webhook "Notificación de cambio de producto". Junto con sys (propiedades del sistema), tiene campos de configuración como el destino del envío, los eventos suscritos y las condiciones de activación.

{
  "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": "Notificación de cambio de producto",
  "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
}

Claves principales:

  • sys.id: identificador único del Webhook. Se inserta en {webhookId} de las rutas de consulta individual, modificación y eliminación.
  • url: URL de destino externa a la que se llama cuando ocurre el evento.
  • topics: array que define qué eventos se suscriben. El formato se explica más abajo en topics.
  • filters: condiciones que realmente activan el Webhook entre los eventos suscritos. Se explica más abajo en filters.
  • transformation: configuración que modifica la forma de la petición saliente (método, cuerpo, etc.). Se explica más abajo en transformation.
  • writeBacks: array de operaciones que reciben la respuesta externa y la vuelven a escribir en un Content o un Media. No está presente en el ejemplo anterior. Se explica más abajo en writeBacks.

Propiedades del sistema (sys)

Todo Webhook incluye sus propiedades de sistema comunes en el objeto sys. space, createdBy y updatedBy se incluyen con la forma Refer ({ "sys": { "id", "type": "Refer", "targetType" } }).

PropiedadTipoDescripción
idstringIdentificador único del recurso.
typestringTipo de recurso. Para Webhook siempre es "Webhook".
spaceRefer<Space>El Space al que pertenece este Webhook.
createdByRefer<User>Usuario que lo creó.
createdAtstring (date-time)Momento de creación.
updatedByRefer<User>Usuario que lo modificó por última vez.
updatedAtstring (date-time)Momento de la última modificación.
versioninteger (≥1)Versión del recurso. Aumenta en 1 con cada modificación.

Como el Webhook es un recurso de configuración, no tiene el concepto de publicación. A diferencia de Content o Content Type, no posee propiedades de estado de publicación como publish, archive o status, sino solo version para el seguimiento de cambios. Su activación y desactivación no se controlan mediante publicación, sino con el campo del cuerpo activate.

Propiedades del cuerpo

El cuerpo del Webhook (los valores de configuración que se envían al crear o modificar y que se devuelven en la respuesta) se compone de los siguientes campos.

CampoTipoObligatorioDescripción
namestring (1~64)Nombre del Webhook.
urlstring (url)URL de destino externa a la que se llama cuando ocurre el evento.
activatebooleanSi está activado. Si es false, no se envía la petición aunque ocurra el evento.
topicsstring[]Array de eventos a suscribir. Véase topics más abajo.
filtersFilter[]Array de condiciones de activación. Si se deja vacío, se activan todos los eventos suscritos. Véase filters más abajo.
headersWebhookHeader[] (0~30)Array de cabeceras HTTP que se incluyen en la petición.
httpBasicUsernamestring (1~32)Nombre de usuario de autenticación HTTP Basic.
httpBasicPasswordstring (1~32)Contraseña de autenticación HTTP Basic. Es de solo escritura. No aparece en la respuesta.
transformationTransformationPersonalización de la petición saliente. Véase transformation más abajo.
writeBacksWriteBack[]Array de operaciones de escritura que se ejecutan al recibir la respuesta. Véase writeBacks más abajo.

Cada elemento de headers se compone de key (obligatorio), value (obligatorio) y secret (opcional, boolean). En las cabeceras cuyo secret es true, el valor se oculta en la respuesta. Los valores que no deben quedar expuestos, como las claves de API, se colocan en cabeceras con secret: true.

topics

Cada elemento de topics tiene el formato {recurso}.{acción}. Por ejemplo: Content.Create, Content.Publish, Media.Create.

La acción es una de las siguientes, o *, que significa todas las acciones del recurso (por ejemplo, Content.*).

AcciónSignificado
AllTodas las acciones.
CreateCreación.
ReadConsulta.
EditEdición.
SaveGuardado (modificación). El evento de modificación es Save. No es Update.
DeleteEliminación.
PublishPublicación.
UnpublishAnulación de publicación.
ArchiveArchivado.
UnarchiveDesarchivado.

filters

filters es un array que acota qué condiciones activan realmente el Webhook entre los topics suscritos. Cada filtro tiene la siguiente forma.

{ "doc": "sys.contentType.sys.id", "op": "EQ", "value": "3trmXRLdJF4GBlAjtcuoZ7Pnxj8dlA" }
  • doc: ruta del campo a comparar. Es una de sys.id, sys.contentType.sys.id, sys.createdBy.sys.id o sys.updatedBy.sys.id.
  • op: operador de comparación. Es uno de EQ, NE, IN, NOT_IN, REGEX o NOT_REGEX.
  • value: valor de comparación. Para EQ, NE, REGEX y NOT_REGEX se da una cadena; para IN y NOT_IN, un array de cadenas.

Si se definen varios filtros, todos deben cumplirse para que se active (AND). Si se deja filters vacío, se activan todos los eventos de los topics suscritos.

transformation

transformation modifica la forma de la petición HTTP saliente. Si no se especifica, todo el payload del recurso sale tal cual con el POST predeterminado.

ClaveTipoDescripción
methodstringMétodo HTTP. Uno de GET, POST, PUT, DELETE o PATCH.
contentTypestringContent-Type del cuerpo de la petición.
bodyobjectObjeto que compone el cuerpo a enviar mediante plantillas de JSON Pointer.
includeBodybooleanSi se envía también el cuerpo del recurso que dispara el evento.

writeBacks

writeBacks es un array ordenado de operaciones que toman la respuesta externa recibida por el Webhook y la vuelven a escribir en un Content o un Media. Solo se ejecutan en orden cuando la API externa responde con un 2xx. Cada elemento contiene un único $content (WriteBackContent) o $media (WriteBackMedia).

Claves de WriteBackContent ($content):

ClaveTipoDescripción
actionstringUna de Create, Update, Delete, Publish, Unpublish, Archive o Unarchive.
contentTypeRefer<ContentType>El Content Type a crear en Create. Basta con dar el sys.id.
targetstringPlantilla de JSON Pointer que apunta al sys.id del Content de destino en Update, Delete, etc. (por ejemplo, { /response/id }). Debe ir envuelto en { }; si no se envuelve, se trata como literal. Si se omite, se toma como destino el recurso que disparó el Webhook.
localestringLocale en el que escribir los valores en Create y Update. Código de locale o plantilla de puntero. Si se omite, el locale predeterminado del Space.
fieldsobjectMapa de clave de campo de destino a expresión de origen en Create y Update. La clave es el apiName del campo del Content de destino.
publishbooleanSi publicar tras Create o Update. Valor predeterminado true.
unpublishbooleanSi anular la publicación antes de eliminar en Delete. Valor predeterminado true.

Claves de WriteBackMedia ($media):

ClaveTipoDescripción
actionstringUna de Create, Delete, Publish, Unpublish, Archive o Unarchive.
sourcestringPlantilla de puntero del valor a importar como Media en Create (por ejemplo, { /response/data/0/url }). Debe ir envuelto en { }.
encodingstringForma de interpretar source en Create. Una de Url, Base64 o Binary.
localestringLocale en el que escribir el archivo, el título y la descripción en Create. Si se omite, el locale predeterminado del Space.
titlestringTítulo del Media en Create (expresión de origen o literal).
descriptionstringDescripción del Media en Create.
targetstringPlantilla de puntero que apunta al sys.id del Media de destino en Delete, etc. Si se omite, el destino es el recurso que dispara el evento.
publishbooleanSi publicar tras completar el procesamiento en Create. Valor predeterminado true.
unpublishbooleanSi anular la publicación antes de eliminar en Delete. Valor predeterminado true.

A continuación se muestra un ejemplo de writeBacks que extrae valores del JSON de respuesta externa y crea 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/... } es una plantilla de JSON Pointer que extrae valores del JSON de respuesta recibido por el Webhook. Las claves de fields (productName, price) son los apiName de los campos del Content de destino. El ejemplo anterior rellena el title de la respuesta en productName del Content y el price en price, crea el Content y luego lo publica.

API

La URL base de todos los endpoints siguientes es https://cma.weegloo.com/v1, y se requiere un token Bearer que autentique en CMA en la cabecera Authorization. La modificación (PUT) y la modificación parcial (PATCH) deben enviar además la cabecera X-Weegloo-Version (el sys.version del recurso actual) para el control de concurrencia optimista.

  • Content: los datos del cuerpo que activan el Webhook o que se escriben mediante WriteBack.
  • Media: el recurso de archivo que se puede crear mediante WriteBack.
  • SpaceRole: cuando se restringe con :self el acceso al Content de las operaciones del Webhook.