Kanał Custom nie publikuje w żadnej sieci. Wysyła każdy zaplanowany post jako JSON na adres URL, którego jesteś właścicielem, a to, co stanie się dalej, zależy od Twojego kodu.

Użyj go do CMS-a, z którym Ocoya się nie łączy, generatora stron statycznych, wewnętrznej kolejki recenzji albo czegokolwiek, co wolisz zbudować, zamiast czekać.

Połącz endpoint

Okno Connect a custom destination z polami Name, Publish URL i opcjonalnym Delete URL po lewej, szarym panelem po prawej z nagłówkiem What your endpoint should reply pokazującym fragment JSON zwracający url oraz przyciskiem Connect destination

Formularz połączenia. Panel obok pól to kontrakt odpowiedzi — status 2xx i adres, do którego prowadzi link.

1

Otwórz Channels

Wybierz Channels na lewym pasku bocznym, a potem Connect channel.

2

Wybierz Custom

Wybierz Custom w panelu Add a connection.

3

Nadaj nazwę

Nadaj nazwę, którą rozpoznasz na liście kanałów, np. My blog. To tylko etykieta.

4

Wpisz swój publish URL

Pełny adres URL, razem ze schematem — https://example.com/hooks/content. Musi być osiągalny z serwerów Ocoya, więc adres na Twoim komputerze lub w sieci prywatnej nie zadziała.

Jeśli Twoja strona przekierowuje — example.com na www.example.com albo http na https — działają obie formy. Ocoya podąża za przekierowaniem po sprawdzeniu nowego adresu tak samo, jak sprawdziła pierwszy.

5

Opcjonalnie dodaj delete URL

W Advanced options. Drugi adres, używany, gdy post zostanie usunięty w Ocoya — https://example.com/hooks/content/delete. Zostaw puste, a usunięcie posta w Ocoya zostawi go tam, gdzie został opublikowany.

Musi to być inny adres niż powyższy. Twój endpoint publikacji tworzy coś przez POST; gdyby usunięcie trafiało w to samo miejsce, utworzyłoby drugą kopię u każdego odbiorcy, który nie sprawdza nazwy zdarzenia.

6

Opcjonalnie dodaj nagłówki

Także w Advanced options. Większość endpointów chce wiedzieć, że żądanie pochodzi od Ciebie, zanim je przyjmie — dodaj Authorization z wartością Bearer your-token albo dowolny nagłówek, który sprawdza Twój odbiorca. Każdy z nich jest wysyłany z każdym żądaniem — na oba adresy URL.

Bez nagłówka autoryzującego adres URL jest jedynym poświadczeniem — każdy, kto go pozna, może wysyłać posty na Twój endpoint. Dodaj taki nagłówek albo przynajmniej użyj długiej, niemożliwej do odgadnięcia ścieżki.

Wartości nagłówków są przechowywane tak jak poświadczenia i nigdy nie wracają do przeglądarki, więc formularz połączenia pokazuje pustą sekcję Headers nawet dla miejsca docelowego, które je ma. Ponowne połączenie tego samego adresu URL zastępuje cały zestaw — wpisz ponownie każdy nagłówek, który chcesz zachować.

Co otrzymuje Twój endpoint

POST z Content-Type: application/json. Zawiera to, czego potrzebuje blog, i nic więcej:

{
  "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"
  }
}
PoleCo to jest
post.idIdentyfikator tego posta w Ocoya. Pozostaje taki sam, jeśli dostarczenie jest ponawiane, więc używaj go jako klucza, aby zaktualizować wpis zamiast publikować drugą kopię
post.titleTytuł albo null, gdy go nie ustawiono
post.captionTreść dokładnie taka, jak została napisana. Markdown, jeśli napisałeś Markdown
post.imagePierwszy obraz posta jako adres URL do pobrania — pobierz go, nie linkuj bezpośrednio. null, gdy go nie ma. Filmy nie są wysyłane
post.optionsPola artykułu, jeśli post je ma. Wymienione poniżej

Zawartość post.options

Mają je tylko artykuły — napisane przez kampanię blogową. Post opublikowany ręcznie ich nie ma, a options jest wtedy w ogóle pomijane. Traktuj każde pole jako opcjonalne.

PoleTypCo to jest
markdownModebooleantrue, gdy post.caption to Markdown. Renderuj odpowiednio
slugstringBezpieczny dla URL slug utworzony z tytułu — why-your-content-is-not-converting. Możesz go użyć lub zignorować
excerptstringJedno- lub dwuzdaniowe streszczenie, na kartę lub do feedu
seoTitlestringDo 70 znaków, do <title>
seoDescriptionstringDo 200 znaków, do <meta name="description">
tagsstring[]Tagi artykułu. Zwykle jeden
readingMinutesnumberObliczane na podstawie gotowej treści

Artykuł przychodzi w takiej postaci:

{
  "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 to Markdown, gdy markdownMode ma wartość true. Opublikowanie go bez renderowania umieści na Twojej stronie ## The three pillars dokładnie tak, jak zapisano — i tak właśnie to wygląda.

Potrzebujesz czegoś, czego tu nie ma? Daj nam znać. Pola dodajemy wtedy, gdy potrzebuje ich odbiorca, a nie wysyłamy ich na zapas.

Usuwanie posta

Usunięcie posta w Ocoya usuwa go w sieciach, do których trafił. Miejsce docelowe Custom to Twój system, więc Ocoya może go tylko powiadomić — robi to przez POST na delete URL, jeśli go podałeś.

Treść to ponownie opublikowany post z trzema dodatkami: nazwą zdarzenia, znacznikami czasu i — jedynym polem, którego potrzebujesz — id, które Twój endpoint zwrócił przy publikacji.

{
  "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" }
  }
}

Usuwaj według id — identyfikatora, który Twój endpoint zwrócił przy publikacji, przekazanego z powrotem na najwyższym poziomie, aby nie trzeba było nic wyciągać z adresu. Zwrócony przez Ciebie url nie jest wysyłany: endpoint usuwający według własnego id nie potrzebuje adresu, który już zna.

Bez skonfigurowanego delete URL nic nie jest wysyłane. Post zostaje usunięty w Ocoya, a kanał zgłasza, że jego kopia nadal jest aktywna, zamiast po cichu nic nie robić.

Odpowiedz dowolnym statusem 2xx, tak jak przy publikacji. Jeśli post już zniknął po Twojej stronie, odpowiedz 404 lub 410, a Ocoya zapisze go jako już usunięty, a nie jako błąd. Każda inna odpowiedź jest zgłaszana przy poście, a post i tak jest usuwany w Ocoya: miejsce docelowe, które odmawia, nigdy nie jest powodem, by zachować post, który chciałeś usunąć.

Czego Ocoya oczekuje w odpowiedzi

Odpowiedz dowolnym statusem 2xx. Każdy inny jest zapisywany jako nieudana publikacja, a status i treść odpowiedzi są pokazane przy poście, byś widział, co odpowiedział Twój endpoint.

Zwróć id i url

Twój endpoint musi odpowiedzieć obiema wartościami, jako JSON:

{
  "id": "9f2c1a",
  "url": "https://yourblog.com/post"
}
PoleCo to jestCo Ocoya z tym robi
idTwój własny identyfikator tego, co właśnie utworzyłeś — id wiersza, id dokumentuOdsyła go na Twój delete URL jako id. Według tego usuwasz.
urlAdres, pod którym opublikowałeśStaje się linkiem View post przy poście

Obie są wymagane. Odpowiedź 2xx bez nich jest zapisywana jako nieudana publikacja, a komunikat przy poście to mówi — razem z informacją, że treść może już istnieć w Twoim miejscu docelowym, więc ponowna publikacja na ślepo utworzyłaby drugą kopię.

url to jedyny klucz czytany jako adres — permalink był akceptowany jako synonim we wcześniejszych wersjach, a już nie jest.

Zwróć obie wartości w tej samej odpowiedzi. Ocoya czyta je raz, gdy Twój endpoint odpowiada; nie ma callbacku, którym można by je przesłać później, więc endpoint, który kolejkuje pracę, musi znać swoje id i ostateczny adres, zanim odpowie, a nie po.

Twój endpoint ma 30 sekund na odpowiedź. Wolną pracę wykonuj po odpowiedzi, a nie przed nią — potwierdź żądanie, a potem je przetwórz.

Przekierowanie jest wykonywane, a nie traktowane jako błąd, o ile adres, na który wskazuje, przechodzi to samo sprawdzenie co oryginalny — jest publicznie osiągalny i przypięty do tego, na co się rozwiązuje. Metoda jest zachowana, więc Twój endpoint nadal dostaje POST z treścią. Limit to trzy przekierowania.

Limity

Tytuł300 znaków
Treść200 000 znaków
Media20 elementów
Timeout30 sekund
NagłówkiDo 10, wartości do 2000 znaków

Za webhookiem nie stoi żaden dostawca, więc nie ma niczego realnego, z czym można by walidować — odbierającą stronę prowadzisz Ty i to Ty decydujesz, co przyjmuje. To bariery ochronne, a nie ograniczenia: dość szerokie na długi artykuł z mediami, dość wąskie, by niekontrolowane generowanie zostało wychwycone w edytorze, a nie na Twoim endpoincie.

Częste problemy

“A destination URL must start with http:// or https://.” W adresie URL brakuje schematu. Dodaj go.

“”Content-Type” is set by Ocoya and cannot be overridden.” Kilka nagłówków opisuje samo żądanie, a nie uwierzytelnia go — nagłówki treści, Host, Connection, Transfer-Encoding. Ocoya ustawia je sama, więc Twoje nagłówki nie mogą ich zastąpić.

“”…” is not a valid header name.” Nazwa nagłówka to litery, cyfry i myślniki. Spacja lub dwukropek w polu nazwy zwykle oznacza, że wklejono tam całą linię Name: value — nazwa idzie do lewego pola, wartość do prawego.

“That is not a valid URL.” Nie udało się sparsować adresu. Sprawdź literówki i zbędne spacje.

“Your endpoint could not be reached. Check the URL is correct and publicly accessible.” DNS się nie rozwiązał albo połączenie zostało odrzucone. Endpoint na localhost lub w sieci prywatnej nie jest osiągalny z Ocoya.

“Your endpoint answered 200 but did not return id or url.” Żądanie dotarło do Twojego endpointu i zostało przyjęte, ale w odpowiedzi brakowało jednego lub obu wymaganych pól. Ocoya zapisuje to jako nieudaną publikację, ponieważ bez id nie ma później według czego usuwać.

Pamiętaj, że treść może już istnieć w Twoim miejscu docelowym — endpoint odpowiedział przecież sukcesem. Sprawdź, zanim opublikujesz ponownie, bo skończysz z dwiema kopiami.

“This destination has no delete endpoint.” Post został usunięty w Ocoya, a ten kanał nie ma delete URL, więc nic nie wysłano i kopia w Twoim miejscu docelowym nadal tam jest. Połącz miejsce docelowe ponownie z delete URL, aby to zmienić.

“Your endpoint did not respond in time.” Odpowiedź trwała dłużej niż 30 sekund. Najpierw potwierdź, potem przetwarzaj.

“Your endpoint redirected to https://…” Przekierowanie wyszło poza podany adres — na inny host albo inny schemat, którego Ocoya nie mogła ponownie sprawdzić, albo na adres prywatny. Użyj adresu, który odpowiada bezpośrednio. Przekierowanie, które pozostaje na publicznie osiągalnym adresie, jest wykonywane za Ciebie, do trzech razy.

“Your endpoint returned 500: …” Twój kod zgłosił błąd. Szczegóły po statusie to to, co odesłał Twój endpoint, skrócone.

Powiązane