A custom destination ist ein Kanal, der auf eine URL zeigt, die dir gehört, anstatt auf ein soziales Netzwerk. Ocoya sendet für jeden geplanten Post einen POST mit JSON dorthin, und dein Code entscheidet, was „veröffentlichen“ bedeutet – ein Artikel in deinem CMS, eine Zeile in einer Datenbank, eine Nachricht in einer Queue.

Diese Seite ist der Vertrag, den dein Endpoint erfüllen muss. Den vollständigen Request-Body findest du im Hilfe-Center unter Custom (webhook).

Custom destinations werden in der Ocoya-App verbunden — Channels → Connect channel → Custom. Es gibt keinen REST- oder MCP-Endpoint, der so eine Verbindung herstellt; diese Seite beschreibt also den Endpoint, den du schreibst, nicht einen, den du aufrufst.

What Ocoya sends

Ein POST mit einem JSON-Body und Content-Type: application/json, plus alle Header, die du im Kanal konfiguriert hast.

{
  "event": "post.published",
  "post": {
    "id": "clx…",
    "title": "…",
    "caption": "…",
    "image": "https://…",
    "options": { "slug": "…" }
  }
}

What your endpoint must reply

Drei Dinge, alle erforderlich. Ein Publish, bei dem eines davon fehlt, wird als fehlgeschlagen protokolliert.

1. A 2xx status

Alles andere wird als fehlgeschlagener Publish aufgezeichnet, und Status und Response-Body werden beim Post angezeigt, damit du sehen kannst, was dein Endpoint geantwortet hat.

2. An id

Dein eigener Bezeichner für das, was du gerade erstellt hast – eine Datenbank-Zeilen-ID, eine CMS-Dokument-ID, was auch immer du verwenden würdest, um den Datensatz wiederzufinden. Ocoya speichert sie und sendet sie an deine Delete-URL zurück, deshalb wird nach genau dieser ID gelöscht.

3. A url

Die Adresse, an die du veröffentlicht hast. Sie wird in Ocoya zum View post-Link des Posts.

{
  "id": "9f2c1a",
  "url": "https://yourblog.com/post"
}
FieldTypeRequiredWhat it does
idstringYesDein Bezeichner für den erstellten Inhalt. Wird bei einem Delete als id zurückgesendet.
urlstringYesDie veröffentlichte Adresse. Wird zum View post-Link des Posts.

Das sind die einzigen zwei Keys, die aus der Antwort gelesen werden, und beide Schreibweisen müssen exakt stimmen. permalink wurde in früheren Versionen als Synonym für url akzeptiert und wird es jetzt nicht mehr.

Beide werden nur aus dieser Antwort gelesen. Es gibt keinen Callback, um sie später nachzureichen, daher muss ein Endpoint, der die Arbeit in eine Queue legt, seine ID und Adresse schon kennen, bevor er antwortet – nicht erst, nachdem die Arbeit fertig ist.

Wenn dein Endpoint mit 2xx antwortet, aber ohne diese Felder, zeichnet Ocoya das Publish als fehlgeschlagen auf und zeigt das beim Post an. Der Inhalt kann zu diesem Zeitpunkt an deinem Ziel durchaus schon existieren – die Meldung weist auch darauf hin, weil ein blindes erneutes Veröffentlichen eine zweite Kopie erzeugen würde.

Timing

Dein Endpoint hat 30 Sekunden für die Antwort. Bestätige die Anfrage zuerst und erledige die langsame Arbeit danach – nicht umgekehrt.

Ein Redirect wird verfolgt und nicht als Fehler gewertet, solange die Zieladresse dieselben Prüfungen besteht wie die ursprüngliche. Die Methode bleibt erhalten, dein Endpoint erhält also weiterhin einen POST mit dem Body. Maximal drei Redirect-Hops werden gefolgt.

Deleting

Wenn der Kanal eine Delete-URL hat, löst das Löschen eines Posts in Ocoya eine post.deleted-Anfrage dorthin aus, die die id enthält, die du bei der Veröffentlichung zurückgegeben hast:

{
  "event": "post.deleted",
  "id": "9f2c1a",
  "post": { … }
}

id steht ganz oben auf Root-Ebene und alleine – der Bezeichner, den du vergeben hast, ohne dass etwas geparst oder durch einen Wrapper gegriffen werden müsste. Die url, die du zurückgegeben hast, wird nicht erneut gesendet: Ein Endpoint, der anhand seiner eigenen ID löscht, kann mit einer Adresse, die er bereits kennt, nichts anfangen.

Antworte mit einem beliebigen 2xx. Wenn der Post auf deiner Seite bereits weg ist, werden 404 oder 410 als „bereits gelöscht“ und nicht als Fehler aufgezeichnet. Der Post wird in Ocoya in jedem Fall gelöscht.

Custom (webhook)

Der vollständige Payload, Header, Limits und häufige Probleme.