Der Kanal Custom veröffentlicht nicht in einem Netzwerk. Er sendet jeden geplanten Beitrag als JSON an eine URL, die dir gehört. Was danach passiert, entscheidet dein Code.

Nutze ihn für ein CMS, das Ocoya nicht anbindet, einen Static-Site-Generator, eine interne Review-Warteschlange oder alles, was du lieber selbst baust, als darauf zu warten.

Einen Endpunkt verbinden

Dialog „Connect a custom destination“ mit den Feldern Name, Publish URL und optional Delete URL links, einem grauen Feld rechts mit der Überschrift What your endpoint should reply und einem JSON-Ausschnitt, der eine url zurückgibt, sowie einer Schaltfläche Connect destination

Das Verbindungsformular. Das Feld neben den Eingaben ist der Antwortvertrag: ein 2xx und die Adresse, auf die verlinkt wird.

1

Channels öffnen

Wähle in der linken Seitenleiste Channels, dann Connect channel.

2

Custom wählen

Wähle Custom im Bereich Add a connection.

3

Einen Namen vergeben

Gib dem Kanal einen Namen, den du in der Kanalliste wiedererkennst, etwa Mein Blog. Das ist nur eine Bezeichnung.

4

Publish-URL eingeben

Die vollständige URL samt Schema – https://example.com/hooks/content. Sie muss von den Servern von Ocoya aus erreichbar sein. Eine Adresse auf deinem eigenen Rechner oder in einem privaten Netzwerk funktioniert also nicht.

Wenn deine Website weiterleitet – von example.com auf www.example.com oder von http auf https –, funktioniert beides. Ocoya folgt der Weiterleitung, nachdem es die neue Adresse genauso geprüft hat wie die erste.

5

Optional: eine Delete-URL hinzufügen

Unter Advanced options. Eine zweite Adresse, die verwendet wird, wenn ein Beitrag in Ocoya gelöscht wird – https://example.com/hooks/content/delete. Lässt du sie leer, bleibt ein in Ocoya gelöschter Beitrag dort, wo er veröffentlicht wurde.

Sie muss sich von der URL oben unterscheiden. Dein Publish-Endpunkt legt bei POST etwas an. Ginge das Löschen an dieselbe Stelle, würde bei jedem Empfänger, der den Ereignisnamen nicht prüft, eine zweite Kopie entstehen.

6

Optional: Header hinzufügen

Ebenfalls unter Advanced options. Die meisten Endpunkte wollen wissen, dass die Anfrage von dir kommt, bevor sie sie annehmen. Füge Authorization mit dem Wert Bearer your-token hinzu oder den Header, den dein Empfänger prüft. Jeder Header wird mit jeder Anfrage gesendet, an beide URLs.

Ohne einen autorisierenden Header ist die URL das einzige Zugangsmerkmal: Jeder, der sie erfährt, kann an deinen Endpunkt posten. Füge einen hinzu oder verwende zumindest einen langen, nicht erratbaren Pfad.

Header-Werte werden wie Zugangsdaten gespeichert und nie an den Browser zurückgesendet. Das Verbindungsformular zeigt deshalb auch bei einem Ziel mit Headern einen leeren Bereich Headers. Wenn du dieselbe URL erneut verbindest, wird der gesamte Satz ersetzt. Gib also alle Header, die bleiben sollen, noch einmal ein.

Was dein Endpunkt erhält

Ein POST mit Content-Type: application/json. Er enthält, was ein Blog braucht, und sonst nichts:

{
  "event": "post.published",
  "publishedAt": "2026-09-17T09:00:00.000Z",
  "post": {
    "id": "clx…",
    "title": "Three labels, one warmer palette",
    "caption": "Testing a softer set of creams…",
    "image": "https://…/image.jpg"
  }
}
FeldWas es ist
post.idDie ID dieses Beitrags bei Ocoya. Sie bleibt gleich, wenn eine Zustellung wiederholt wird. Nutze sie also als Schlüssel, um zu aktualisieren, statt eine zweite Kopie zu veröffentlichen
post.titleDer Titel oder null, wenn keiner gesetzt war
post.captionDer Text, genau wie verfasst. Markdown, wenn du Markdown geschrieben hast
post.imageDas erste Bild des Beitrags als URL zum Abrufen – lade es herunter, verlinke es nicht direkt. null, wenn es keines gibt. Videos werden nicht gesendet
post.optionsArtikelfelder, wenn der Beitrag welche hat. Unten aufgelistet

Inhalt von post.options

Nur ein Artikel hat diese Felder – einer, der von einer Blog-Kampagne geschrieben wurde. Ein von Hand veröffentlichter Beitrag hat keine, und options fehlt dann ganz. Behandle jedes Feld als optional.

FeldTypWas es ist
markdownModebooleantrue, wenn post.caption Markdown ist. Rendere entsprechend
slugstringEin URL-tauglicher Slug, abgeleitet vom Titel – why-your-content-is-not-converting. Du kannst ihn verwenden oder ignorieren
excerptstringEine Zusammenfassung in ein oder zwei Sätzen, für eine Karte oder einen Feed
seoTitlestringBis zu 70 Zeichen, für <title>
seoDescriptionstringBis zu 200 Zeichen, für <meta name="description">
tagsstring[]Tags für den Artikel. Meist eines
readingMinutesnumberAus dem fertigen Text berechnet

So sieht ein Artikel aus, wenn er ankommt:

{
  "event": "post.published",
  "publishedAt": "2026-09-22T09:00:00.000Z",
  "post": {
    "id": "clx…",
    "title": "Why your content is not converting",
    "caption": "You're posting every day and still refreshing an empty inbox.\n\n## The three pillars\n\n- A clear offer, repeated\n- One place to send people\n",
    "image": "https://…/cover.png",
    "options": {
      "markdownMode": true,
      "slug": "why-your-content-is-not-converting",
      "excerpt": "Volume is rarely the problem. Nothing you publish asks anybody to do anything.",
      "seoTitle": "Why your content is not converting",
      "seoDescription": "Volume is rarely the problem. Here is the system that fixes it.",
      "tags": ["content-marketing"],
      "readingMinutes": 7
    }
  }
}

post.caption ist Markdown, wenn markdownMode true ist. Veröffentlichst du es ohne Rendering, steht ## The three pillars genau so auf deiner Website, wie es getippt wurde – und so sieht es auch aus.

Du brauchst etwas, das hier fehlt? Sag uns Bescheid. Felder kommen hinzu, wenn ein Empfänger sie braucht, statt auf Verdacht mitgesendet zu werden.

Einen Beitrag löschen

Wenn du einen Beitrag in Ocoya löschst, wird er auch in den Netzwerken gelöscht, an die er ging. Ein Custom-Ziel ist dein System, deshalb kann Ocoya es nur benachrichtigen. Das geschieht per POST an die Delete-URL, falls du eine angegeben hast.

Der Body ist wieder der veröffentlichte Beitrag, mit drei Ergänzungen: dem Ereignisnamen, den Zeitstempeln und – dem einzigen Feld, das du brauchst – der id, die dein Endpunkt beim Veröffentlichen zurückgegeben hat.

{
  "event": "post.deleted",
  "id": "9f2c1a",
  "publishedAt": "2026-09-22T09:00:00.000Z",
  "deletedAt": "2026-09-28T14:12:00.000Z",
  "post": {
    "id": "clx…",
    "title": "Why your content is not converting",
    "caption": "…",
    "image": null,
    "options": { "slug": "why-your-content-is-not-converting" }
  }
}

Lösche per id – der Kennung, die dein Endpunkt beim Veröffentlichen zurückgegeben hat. Sie wird unverändert auf oberster Ebene zurückgegeben, sodass nichts aus einer Adresse herausgelesen werden muss. Die zurückgegebene url wird nicht gesendet: Ein Endpunkt, der nach seiner eigenen ID löscht, braucht eine Adresse nicht, die er ohnehin kennt.

Ist keine Delete-URL konfiguriert, wird nichts gesendet. Der Beitrag wird in Ocoya gelöscht, und der Kanal meldet, dass seine Kopie noch live ist, statt stillschweigend nichts zu tun.

Antworte mit einem beliebigen 2xx, genau wie beim Veröffentlichen. Ist ein Beitrag auf deiner Seite schon weg, antworte mit 404 oder 410: Ocoya verbucht ihn dann als bereits gelöscht und nicht als Fehler. Alles andere wird am Beitrag gemeldet, und der Beitrag wird in Ocoya in jedem Fall gelöscht: Ein Ziel, das ablehnt, ist nie ein Grund, einen Beitrag zu behalten, den du löschen wolltest.

Was Ocoya als Antwort erwartet

Antworte mit einem beliebigen 2xx-Status. Alles andere wird als fehlgeschlagene Veröffentlichung verbucht, und Status und Antwort-Body werden am Beitrag angezeigt, damit du siehst, was dein Endpunkt gesagt hat.

Gib eine ID und eine URL zurück

Dein Endpunkt muss mit beidem antworten, als JSON:

{
  "id": "9f2c1a",
  "url": "https://yourblog.com/post"
}
FeldWas es istWas Ocoya damit macht
idDeine eigene Kennung für das, was du gerade erstellt hast – eine Zeilen-ID, eine Dokument-IDSendet sie als id an deine Delete-URL zurück. Danach löschst du.
urlDie Adresse, an die du veröffentlicht hastWird zum Link View post des Beitrags

Beides ist Pflicht. Ein 2xx ohne beides wird als fehlgeschlagene Veröffentlichung verbucht, und die Meldung am Beitrag sagt das auch – einschließlich des Hinweises, dass der Inhalt an deinem Ziel schon existieren kann und ein blindes erneutes Veröffentlichen deshalb eine zweite Kopie anlegen würde.

url ist der einzige Schlüssel, der für die Adresse gelesen wird – permalink wurde in früheren Versionen als Synonym akzeptiert und wird es nicht mehr.

Gib beides in derselben Antwort zurück. Ocoya liest sie einmal, wenn dein Endpunkt antwortet. Einen Callback, mit dem du sie nachreichen könntest, gibt es nicht. Ein Endpunkt, der die Arbeit in eine Warteschlange stellt, muss seine ID und seine endgültige Adresse also kennen, bevor er antwortet, nicht erst danach.

Dein Endpunkt hat 30 Sekunden Zeit zu antworten. Erledige die langsame Arbeit nach der Antwort, nicht davor: Bestätige die Anfrage und verarbeite sie dann.

Eine Weiterleitung wird befolgt und nicht als Fehler behandelt, solange die Adresse, auf die sie zeigt, dieselbe Prüfung besteht wie die ursprüngliche – öffentlich erreichbar und auf das festgelegt, wohin sie auflöst. Die Methode bleibt erhalten, dein Endpunkt erhält also weiterhin einen POST mit dem Body. Drei Weiterleitungen sind das Maximum.

Limits

Titel300 Zeichen
Text200.000 Zeichen
Medien20 Elemente
Timeout30 Sekunden
HeaderBis zu 10, Werte mit 2.000 Zeichen

Hinter einem Webhook steht kein Anbieter, es gibt also nichts Echtes, wogegen validiert werden könnte: Du besitzt die empfangende Seite und entscheidest, was sie annimmt. Das sind eher Leitplanken als Limits: weit genug für einen langen Artikel mit seinen Medien, eng genug, damit eine ausufernde Generierung im Composer auffällt und nicht erst bei deinem Endpunkt.

Häufige Probleme

„A destination URL must start with http:// or https://.“ Der URL fehlt das Schema. Gib es an.

„”Content-Type” is set by Ocoya and cannot be overridden.“ Einige Header beschreiben die Anfrage selbst, statt sie zu authentifizieren – die Content-Header, Host, Connection, Transfer-Encoding. Ocoya setzt sie, deine eigenen Header können sie daher nicht ersetzen.

„”…” is not a valid header name.“ Ein Header-Name besteht aus Buchstaben, Ziffern und Bindestrichen. Ein Leerzeichen oder ein Doppelpunkt im Namensfeld bedeutet meist, dass die ganze Zeile Name: value dort eingefügt wurde: Der Name gehört ins linke Feld, der Wert ins rechte.

„That is not a valid URL.“ Die Adresse konnte nicht gelesen werden. Prüfe sie auf Tippfehler und überflüssige Leerzeichen.

„Your endpoint could not be reached. Check the URL is correct and publicly accessible.“ Die DNS-Auflösung ist fehlgeschlagen oder die Verbindung wurde abgelehnt. Ein Endpunkt auf localhost oder in einem privaten Netzwerk ist von Ocoya aus nicht erreichbar.

„Your endpoint answered 200 but did not return id or url.“ Die Anfrage hat deinen Endpunkt erreicht und er hat sie angenommen, aber in der Antwort fehlte eines der Pflichtfelder oder beide. Ocoya verbucht das als fehlgeschlagene Veröffentlichung, weil es ohne id später nichts gibt, wonach gelöscht werden könnte.

Beachte, dass der Inhalt an deinem Ziel schon existieren kann – der Endpunkt hat ja erfolgreich geantwortet. Prüfe das, bevor du erneut veröffentlichst, sonst hast du zwei Kopien.

„This destination has no delete endpoint.“ Ein Beitrag wurde in Ocoya gelöscht, und für diesen Kanal gibt es keine Delete-URL. Es wurde also nichts gesendet, und die Kopie an deinem Ziel ist noch da. Verbinde das Ziel erneut mit einer Delete-URL, um das zu ändern.

„Your endpoint did not respond in time.“ Er hat länger als 30 Sekunden gebraucht. Erst bestätigen, danach verarbeiten.

„Your endpoint redirected to https://…“ Die Weiterleitung hat die von dir angegebene Adresse verlassen – ein anderer Host oder ein anderes Schema, das Ocoya nicht erneut prüfen konnte, oder eine Adresse, die auf etwas Privates aufgelöst wurde. Verwende die Adresse, die direkt antwortet. Eine Weiterleitung, die auf einer öffentlich erreichbaren Adresse bleibt, wird für dich befolgt, bis zu drei Mal.

„Your endpoint returned 500: …“ Dein Code hat einen Fehler ausgelöst. Das Detail nach dem Status ist das, was dein Endpunkt zurückgesendet hat, gekürzt.

Verwandte Artikel