Webhook

Zuletzt aktualisiert: 22. Juni 2026

Ein Webhook ist eine Konfiguration, die eine HTTP-Anfrage an eine vorab festgelegte externe URL sendet, wenn in einem Space etwas geschieht (z. B. die Erstellung oder Veröffentlichung von Content). Er wird für die Anbindung externer Systeme oder für Automatisierung verwendet. So lässt sich beispielsweise konfigurieren, dass bei jeder Veröffentlichung eines Produkt-Content ein interner Benachrichtigungsserver oder eine externe API aufgerufen wird.

Ein Webhook sendet nicht nur eine Anfrage, sondern kann zusätzlich einen WriteBack konfigurieren, der die empfangene Antwort entgegennimmt und zurück in Content oder Media schreibt. Auf diese Weise wird ein asynchroner Arbeitsablauf aufgebaut, der das Ergebnis einer externen API als Daten innerhalb des Space aufnimmt. Ein Webhook ist in der CMA eine untergeordnete Ressource des Space und basiert auf dem Pfad /spaces/{spaceId}/webhooks.

Ressourcenstruktur

Im Folgenden sehen Sie die Antwort der Einzelabfrage des Webhook "Benachrichtigung bei Produktänderung". Neben sys (Systemeigenschaften) enthält er Konfigurationsfelder wie Sendeziel, abonnierte Ereignisse und Auslösebedingungen.

{
  "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": "Benachrichtigung bei Produktänderung",
  "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
}

Wichtige Schlüssel:

  • sys.id: Eindeutige Kennung des Webhook. Wird im Pfad für Einzelabfrage, Änderung und Löschung als {webhookId} eingesetzt.
  • url: Externe Ziel-URL, die beim Eintreten eines Ereignisses aufgerufen wird.
  • topics: Array, das festlegt, welche Ereignisse abonniert werden. Das Format wird unten unter topics beschrieben.
  • filters: Bedingung, unter der ein abonniertes Ereignis tatsächlich ausgelöst wird. Wird unten unter filters beschrieben.
  • transformation: Konfiguration, die die Form der ausgehenden Anfrage (Methode, Body usw.) ändert. Wird unten unter transformation beschrieben.
  • writeBacks: Array von Aufgaben, die die externe Antwort entgegennehmen und zurück in Content oder Media schreiben. Im Beispiel oben nicht vorhanden. Wird unten unter writeBacks beschrieben.

Systemeigenschaften (sys)

Jeder Webhook führt gemeinsame Systemeigenschaften im sys-Objekt. space, createdBy und updatedBy werden in der Refer-Form ({ "sys": { "id", "type": "Refer", "targetType" } }) angegeben.

EigenschaftTypBeschreibung
idstringEindeutige Kennung der Ressource.
typestringRessourcenart. Bei einem Webhook immer "Webhook".
spaceRefer<Space>Space, zu dem dieser Webhook gehört.
createdByRefer<User>Benutzer, der die Ressource erstellt hat.
createdAtstring (date-time)Zeitpunkt der Erstellung.
updatedByRefer<User>Benutzer, der die Ressource zuletzt geändert hat.
updatedAtstring (date-time)Zeitpunkt der letzten Änderung.
versioninteger (≥1)Version der Ressource. Erhöht sich bei jeder Änderung um 1.

Ein Webhook ist eine Konfigurationsressource und kennt daher kein Konzept der Veröffentlichung. Anders als Content oder Content Type besitzt er keine Veröffentlichungsstatus-Eigenschaften wie publish, archive oder status, sondern nur die version zur Änderungsverfolgung. Das Ein- und Ausschalten erfolgt nicht über Veröffentlichung, sondern wird über das Body-Feld activate gesteuert.

Body-Eigenschaften

Der Body eines Webhook (die Konfigurationswerte, die bei Erstellung und Änderung gesendet werden und in der Antwort zurückkommen) besteht aus den folgenden Feldern.

FeldTypErforderlichBeschreibung
namestring (1-64)Name des Webhook.
urlstring (url)Externe Ziel-URL, die beim Eintreten eines Ereignisses aufgerufen wird.
activatebooleanEingeschaltet-Status. Bei false wird auch beim Eintreten eines Ereignisses keine Anfrage gesendet.
topicsstring[]Array der abonnierten Ereignisse. Siehe unten topics.
filtersFilter[]Array von Auslösebedingungen. Wenn leer, lösen alle abonnierten Ereignisse aus. Siehe unten filters.
headersWebhookHeader[] (0-30)Array von HTTP-Headern, die mit der Anfrage gesendet werden.
httpBasicUsernamestring (1-32)Benutzername für die HTTP-Basic-Authentifizierung.
httpBasicPasswordstring (1-32)Passwort für die HTTP-Basic-Authentifizierung. Nur schreibbar. Erscheint nicht in der Antwort.
transformationTransformationAnpassung der ausgehenden Anfrage. Siehe unten transformation.
writeBacksWriteBack[]Array von Schreibaufgaben, die nach Erhalt der Antwort ausgeführt werden. Siehe unten writeBacks.

Jeder Eintrag in headers besteht aus key (erforderlich), value (erforderlich) und secret (optional, boolean). Bei einem Header mit secret gleich true wird der Wert in der Antwort verdeckt. Werte, die nicht offengelegt werden dürfen, wie etwa API-Schlüssel, gehören in einen Header mit secret: true.

topics

Jeder Eintrag in topics hat das Format {Ressource}.{Aktion}. Beispiel: Content.Create, Content.Publish, Media.Create.

Die Aktion ist entweder eine der folgenden oder das *, das alle Aktionen der Ressource bedeutet (z. B. Content.*).

AktionBedeutung
AllAlle Aktionen.
CreateErstellung.
ReadAbfrage.
EditBearbeitung.
SaveSpeichern (Änderung). Das Änderungsereignis ist Save, nicht Update.
DeleteLöschung.
PublishVeröffentlichung.
UnpublishVeröffentlichung zurücknehmen.
ArchiveArchivierung.
UnarchiveArchivierung aufheben.

filters

filters ist ein Array, das eingrenzt, welche der abonnierten topics den Webhook tatsächlich auslösen. Jeder Filter hat die folgende Form.

{ "doc": "sys.contentType.sys.id", "op": "EQ", "value": "3trmXRLdJF4GBlAjtcuoZ7Pnxj8dlA" }
  • doc: Zu vergleichender Feldpfad. Einer von sys.id, sys.contentType.sys.id, sys.createdBy.sys.id, sys.updatedBy.sys.id.
  • op: Vergleichsoperator. Einer von EQ, NE, IN, NOT_IN, REGEX, NOT_REGEX.
  • value: Vergleichswert. Bei EQ, NE, REGEX, NOT_REGEX ein String, bei IN, NOT_IN ein String-Array.

Sind mehrere Filter gesetzt, muss die Auslösung alle erfüllen (AND). Ist filters leer, lösen alle Ereignisse der abonnierten topics aus.

transformation

transformation ändert die Form der ausgehenden HTTP-Anfrage. Ohne Angabe geht die gesamte Ressourcen-Payload unverändert per Standard-POST hinaus.

SchlüsselTypBeschreibung
methodstringHTTP-Methode. Einer von GET, POST, PUT, DELETE, PATCH.
contentTypestringContent-Type des Anfrage-Body.
bodyobjectObjekt, das den zu sendenden Body über eine JSON-Pointer-Vorlage zusammensetzt.
includeBodybooleanOb der Body der auslösenden Ressource mitgesendet wird.

writeBacks

writeBacks ist ein geordnetes Array von Aufgaben, die die von einem Webhook empfangene externe Antwort verwenden, um zurück in Content oder Media zu schreiben. Sie werden nur dann der Reihe nach ausgeführt, wenn die externe API mit 2xx antwortet. Jeder Eintrag enthält entweder ein $content (WriteBackContent) oder ein $media (WriteBackMedia).

Schlüssel von WriteBackContent ($content):

SchlüsselTypBeschreibung
actionstringEiner von Create, Update, Delete, Publish, Unpublish, Archive, Unarchive.
contentTypeRefer<ContentType>Der bei Create zu erstellende Content Type. Es genügt, nur die sys.id anzugeben.
targetstringJSON-Pointer-Vorlage, die bei Update, Delete usw. auf die sys.id des Ziel-Content verweist (z. B. { /response/id }). Muss in { } eingeschlossen sein; andernfalls wird der Wert als Literal behandelt. Ohne Angabe gilt die Ressource, die den Webhook ausgelöst hat, als Ziel.
localestringLocale, in die der Wert bei Create, Update geschrieben wird. Locale-Code oder Pointer-Vorlage. Ohne Angabe die Standard-Locale des Space.
fieldsobjectMap von Zielfeldschlüssel zu Quellausdruck bei Create, Update. Der Schlüssel ist der apiName des Ziel-Content-Felds.
publishbooleanOb nach Create, Update veröffentlicht wird. Standardwert true.
unpublishbooleanOb bei Delete vor dem Löschen die Veröffentlichung zurückgenommen wird. Standardwert true.

Schlüssel von WriteBackMedia ($media):

SchlüsselTypBeschreibung
actionstringEiner von Create, Delete, Publish, Unpublish, Archive, Unarchive.
sourcestringPointer-Vorlage des Werts, der bei Create in Media übernommen wird (z. B. { /response/data/0/url }). Muss in { } eingeschlossen sein.
encodingstringArt, wie source bei Create interpretiert wird. Einer von Url, Base64, Binary.
localestringLocale, in die bei Create Datei, Titel und Beschreibung geschrieben werden. Ohne Angabe die Standard-Locale des Space.
titlestringTitel des Media bei Create (Quellausdruck oder Literal).
descriptionstringBeschreibung des Media bei Create.
targetstringPointer-Vorlage, die bei Delete usw. auf die sys.id des Ziel-Media verweist. Ohne Angabe ist die auslösende Ressource das Ziel.
publishbooleanOb bei Create nach Abschluss der Verarbeitung veröffentlicht wird. Standardwert true.
unpublishbooleanOb bei Delete vor dem Löschen die Veröffentlichung zurückgenommen wird. Standardwert true.

Im Folgenden sehen Sie ein writeBacks-Beispiel, das Werte aus dem externen Antwort-JSON entnimmt und damit einen Content erstellt.

"writeBacks": [
  {
    "$content": {
      "action": "Create",
      "contentType": { "sys": { "id": "3trmXRLdJF4GBlAjtcuoZ7Pnxj8dlA" } },
      "locale": "ko-KR",
      "fields": {
        "productName": "{ /response/title }",
        "price": "{ /response/price }"
      },
      "publish": true,
      "unpublish": true
    }
  }
]

{ /response/... } ist eine JSON-Pointer-Vorlage, die einen Wert aus dem vom Webhook empfangenen Antwort-JSON entnimmt. Die Schlüssel von fields (productName, price) sind der apiName der Ziel-Content-Felder. Das Beispiel oben füllt das title der Antwort in das productName des Content und das price in price, erstellt damit den Content und veröffentlicht ihn anschließend.

API

Die Basis-URL aller Endpunkte unten ist https://cma.weegloo.com/v1, und im Authorization-Header ist ein Bearer-Token zur Authentifizierung an der CMA erforderlich. Bei Änderung (PUT) und Teiländerung (PATCH) muss zur optimistischen Nebenläufigkeitskontrolle der Header X-Weegloo-Version (die sys.version der aktuellen Ressource) mitgesendet werden.

  • Content: Body-Daten, die einen Webhook auslösen oder per WriteBack geschrieben werden.
  • Media: Dateiressource, die per WriteBack erstellt werden kann.
  • SpaceRole: Wenn der Zugriff auf den Arbeits-Content eines Webhook mit :self beschränkt wird.