O canal Custom não publica numa rede. Envia cada publicação agendada para um URL que lhe pertence, em JSON, e o que acontece a seguir depende do seu código.
Use-o para um CMS a que o Ocoya não se liga, um gerador de sites estáticos, uma fila interna de revisão ou qualquer coisa que prefira construir a ter de esperar.
Ligar um endpoint

O formulário de ligação. O painel ao lado dos campos é o contrato de resposta — um 2xx e o endereço para onde ligar.
Abra Channels
Selecione Channels na barra lateral esquerda e depois Connect channel.
Escolha Custom
Escolha Custom no painel Add a connection.
Dê-lhe um nome
Dê-lhe um nome que reconheça na lista de canais, como My blog. É apenas uma etiqueta.
Introduza o seu publish URL
O URL completo, incluindo o esquema — https://example.com/hooks/content. Tem de ser acessível a partir dos servidores do Ocoya, por isso um endereço na sua própria máquina ou dentro de uma rede privada não funciona.
Se o seu site redireciona — example.com para www.example.com, ou http para https — qualquer uma das formas funciona. O Ocoya segue o redirecionamento depois de verificar o novo endereço da mesma forma que verificou o primeiro.
Opcionalmente, adicione um delete URL
Em Advanced options. Um segundo endereço, usado quando uma publicação é eliminada no Ocoya — https://example.com/hooks/content/delete. Se o deixar vazio, eliminar uma publicação no Ocoya deixa-a onde foi publicada.
Tem de ser um URL diferente do anterior. O seu endpoint de publicação cria algo com POST; se a eliminação fosse para o mesmo sítio, criaria uma segunda cópia em qualquer recetor que não verifique o nome do evento.
Opcionalmente, adicione cabeçalhos
Também em Advanced options. A maioria dos endpoints quer saber que o pedido é seu antes de o aceitar — adicione Authorization com o valor Bearer your-token, ou o cabeçalho que o seu recetor verificar. Cada um é enviado em todos os pedidos — para ambos os URLs.
Sem um cabeçalho de autorização, o URL é a única credencial — qualquer pessoa que o descubra pode publicar no seu endpoint. Adicione um ou, no mínimo, use um caminho longo e impossível de adivinhar.
Os valores dos cabeçalhos são guardados da mesma forma que as credenciais e nunca são enviados de volta para o navegador, por isso o formulário de ligação mostra uma secção Headers vazia mesmo para um destino que os tenha. Ao voltar a ligar o mesmo URL, todo o conjunto é substituído — volte a introduzir todos os cabeçalhos que quer manter.
O que o seu endpoint recebe
Um POST com Content-Type: application/json. Contém o que um blogue precisa e nada mais:
{
"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"
}
}| Campo | O que é |
|---|---|
post.id | O id do Ocoya para esta publicação. Mantém-se igual se uma entrega for repetida, por isso use-o como chave para atualizar em vez de publicar uma segunda cópia |
post.title | O título, ou null quando não foi definido nenhum |
post.caption | O corpo, exatamente como foi escrito. Markdown se escreveu em Markdown |
post.image | A primeira imagem da publicação, como um URL para ir buscar — descarregue-a, não a use diretamente a partir do URL. null quando não há nenhuma. Os vídeos não são enviados |
post.options | Campos de artigo, quando a publicação os tem. Listados abaixo |
Dentro de post.options
Só um artigo os tem — um escrito por uma campanha de blogue. Uma publicação feita manualmente não os tem e options fica totalmente de fora. Trate todos os campos como opcionais.
| Campo | Tipo | O que é |
|---|---|---|
markdownMode | boolean | true quando post.caption é Markdown. Apresente-o em conformidade |
slug | string | Um slug seguro para URLs derivado do título — why-your-content-is-not-converting. Pode usá-lo ou ignorá-lo |
excerpt | string | Um resumo de uma ou duas frases, para um cartão ou um feed |
seoTitle | string | Até 70 caracteres, para <title> |
seoDescription | string | Até 200 caracteres, para <meta name="description"> |
tags | string[] | Etiquetas do artigo. Normalmente uma |
readingMinutes | number | Calculado a partir do corpo final |
Um artigo chega com este aspeto:
{
"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 é Markdown quando markdownMode é true. Publicá-lo sem o processar coloca ## The three pillars no seu site tal como foi escrito — o que é exatamente o aspeto que tem.
Precisa de algo que não está aqui? Diga-nos. Os campos são adicionados quando um recetor precisa deles, em vez de serem enviados por precaução.
Eliminar uma publicação
Eliminar uma publicação no Ocoya elimina-a nas redes para onde foi. Um destino personalizado é o seu sistema, por isso o Ocoya só lhe pode dizer — o que faz com um POST para o delete URL, se tiver indicado um.
O corpo é a publicação publicada outra vez, com três acrescentos: o nome do evento, as datas e horas e — o único campo de que precisa — o id que o seu endpoint devolveu quando publicou.
{
"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" }
}
}Elimine por id — o identificador que o seu endpoint devolveu quando publicou, devolvido tal e qual ao nível superior, para que não seja preciso extrair nada de um endereço. O url que devolveu não é enviado: um endpoint que elimina pelo seu próprio id não tem uso para um endereço que já conhece.
Sem delete URL configurado, nada é enviado. A publicação é eliminada no Ocoya e o canal indica que a sua cópia ainda está ativa, em vez de não fazer nada em silêncio.
Responda com qualquer 2xx, tal como numa publicação. Se a publicação já não existir do seu lado, responda 404 ou 410 e o Ocoya regista-a como já eliminada em vez de como uma falha. Qualquer outra resposta é indicada na publicação, e a publicação é eliminada no Ocoya de qualquer forma: um destino que recusa nunca é motivo para manter uma publicação que pediu para eliminar.
O que o Ocoya espera de volta
Responda com qualquer estado 2xx. Qualquer outro é registado como uma publicação falhada, e o estado e o corpo da resposta são mostrados na publicação para que veja o que o seu endpoint disse.
Devolva um id e um url
O seu endpoint tem de responder com ambos, em JSON:
{
"id": "9f2c1a",
"url": "https://yourblog.com/post"
}| Campo | O que é | O que o Ocoya faz com ele |
|---|---|---|
id | O seu próprio identificador para o que acabou de criar — um id de linha, um id de documento | Envia-o de volta para o seu delete URL como id. É por este que elimina. |
url | O endereço onde publicou | Torna-se a ligação View post da publicação |
Ambos são obrigatórios. Um 2xx sem eles é registado como uma publicação falhada, e a mensagem indica-o na publicação — incluindo que o conteúdo pode já existir no seu destino, pelo que voltar a publicar às cegas criaria uma segunda cópia.
url é a única chave lida para o endereço — permalink era aceite como sinónimo em versões anteriores e já não é.
Devolva ambos na mesma resposta. O Ocoya lê-os uma só vez, quando o seu endpoint responde; não há nenhum callback para os enviar depois, por isso um endpoint que põe o trabalho em fila tem de saber o seu id e o seu endereço final antes de responder, e não depois.
O seu endpoint tem 30 segundos para responder. Faça o trabalho demorado depois de responder, não antes — confirme o pedido e depois processe-o.
Um redirecionamento é seguido em vez de ser tratado como falha, desde que o endereço para onde aponta passe na mesma verificação que o original — publicamente acessível e fixado ao que resolve. O método é mantido, por isso o seu endpoint continua a receber um POST com o corpo. O limite é de três saltos.
Limites
| Título | 300 caracteres |
| Corpo | 200 000 caracteres |
| Multimédia | 20 itens |
| Tempo limite | 30 segundos |
| Cabeçalhos | Até 10, com valores de 2000 caracteres |
Não há nenhum fornecedor por trás de um webhook, por isso não há nada real contra o qual validar — o lado recetor é seu e é você que decide o que aceita. São barreiras de segurança e não limites: largas o suficiente para um artigo longo com a sua multimédia, estreitas o suficiente para que uma geração descontrolada seja apanhada no compositor e não no seu endpoint.
Problemas comuns
“A destination URL must start with http:// or https://.” O URL não tem esquema. Inclua-o.
“”Content-Type” is set by Ocoya and cannot be overridden.” Alguns cabeçalhos descrevem o próprio pedido em vez de o autenticarem — os cabeçalhos de conteúdo, Host, Connection, Transfer-Encoding. O Ocoya define-os, por isso os seus próprios cabeçalhos não os podem substituir.
“”…” is not a valid header name.” Um nome de cabeçalho é composto por letras, algarismos e hífenes. Um espaço ou dois pontos no campo do nome costuma significar que a linha inteira Name: value foi colada nele — o nome vai no campo da esquerda, o valor no da direita.
“That is not a valid URL.” Não foi possível interpretar o endereço. Verifique se há erros de digitação e espaços a mais.
“Your endpoint could not be reached. Check the URL is correct and publicly accessible.” O DNS não resolveu ou a ligação foi recusada. Um endpoint em localhost ou numa rede privada não é acessível a partir do Ocoya.
“Your endpoint answered 200 but did not return id or url.” O pedido chegou ao seu endpoint e este aceitou-o, mas a resposta não tinha um ou ambos os campos obrigatórios. O Ocoya regista isto como uma publicação falhada porque, sem um id, não há nada pelo qual eliminar mais tarde.
Tenha em conta que o conteúdo pode já existir no seu destino — o endpoint respondeu com sucesso. Verifique antes de voltar a publicar, ou ficará com duas cópias.
“This destination has no delete endpoint.” Uma publicação foi eliminada no Ocoya e este canal não tem delete URL, por isso nada foi enviado e a cópia no seu destino continua lá. Volte a ligar o destino com um delete URL para mudar isso.
“Your endpoint did not respond in time.” Demorou mais de 30 segundos. Confirme primeiro, processe depois.
“Your endpoint redirected to https://…” O redirecionamento saiu do endereço que indicou — outro anfitrião ou outro esquema que o Ocoya não conseguiu voltar a verificar, ou um que resolveu para um endereço privado. Use o endereço que responde diretamente. Um redirecionamento que fica num endereço publicamente acessível é seguido por si, até três saltos.
“Your endpoint returned 500: …” O seu código gerou um erro. O detalhe a seguir ao estado é o que o seu endpoint devolveu, truncado.