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

Formularz połączenia. Panel obok pól to kontrakt odpowiedzi — status 2xx i adres, do którego prowadzi link.
Otwórz Channels
Wybierz Channels na lewym pasku bocznym, a potem Connect channel.
Wybierz Custom
Wybierz Custom w panelu Add a connection.
Nadaj nazwę
Nadaj nazwę, którą rozpoznasz na liście kanałów, np. My blog. To tylko etykieta.
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.
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.
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"
}
}| Pole | Co to jest |
|---|---|
post.id | Identyfikator 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.title | Tytuł albo null, gdy go nie ustawiono |
post.caption | Treść dokładnie taka, jak została napisana. Markdown, jeśli napisałeś Markdown |
post.image | Pierwszy obraz posta jako adres URL do pobrania — pobierz go, nie linkuj bezpośrednio. null, gdy go nie ma. Filmy nie są wysyłane |
post.options | Pola 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.
| Pole | Typ | Co to jest |
|---|---|---|
markdownMode | boolean | true, gdy post.caption to Markdown. Renderuj odpowiednio |
slug | string | Bezpieczny dla URL slug utworzony z tytułu — why-your-content-is-not-converting. Możesz go użyć lub zignorować |
excerpt | string | Jedno- lub dwuzdaniowe streszczenie, na kartę lub do feedu |
seoTitle | string | Do 70 znaków, do <title> |
seoDescription | string | Do 200 znaków, do <meta name="description"> |
tags | string[] | Tagi artykułu. Zwykle jeden |
readingMinutes | number | Obliczane 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"
}| Pole | Co to jest | Co Ocoya z tym robi |
|---|---|---|
id | Twój własny identyfikator tego, co właśnie utworzyłeś — id wiersza, id dokumentu | Odsyła go na Twój delete URL jako id. Według tego usuwasz. |
url | Adres, 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 |
| Media | 20 elementów |
| Timeout | 30 sekund |
| Nagłówki | Do 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.