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

Caixa de diálogo Connect a custom destination com os campos Name, Publish URL e Delete URL opcional à esquerda, um painel cinzento à direita com o título What your endpoint should reply a mostrar um excerto JSON que devolve um url, e um botão Connect destination

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.

1

Abra Channels

Selecione Channels na barra lateral esquerda e depois Connect channel.

2

Escolha Custom

Escolha Custom no painel Add a connection.

3

Dê-lhe um nome

Dê-lhe um nome que reconheça na lista de canais, como My blog. É apenas uma etiqueta.

4

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.

5

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.

6

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"
  }
}
CampoO que é
post.idO 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.titleO título, ou null quando não foi definido nenhum
post.captionO corpo, exatamente como foi escrito. Markdown se escreveu em Markdown
post.imageA 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.optionsCampos 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.

CampoTipoO que é
markdownModebooleantrue quando post.caption é Markdown. Apresente-o em conformidade
slugstringUm slug seguro para URLs derivado do título — why-your-content-is-not-converting. Pode usá-lo ou ignorá-lo
excerptstringUm resumo de uma ou duas frases, para um cartão ou um feed
seoTitlestringAté 70 caracteres, para <title>
seoDescriptionstringAté 200 caracteres, para <meta name="description">
tagsstring[]Etiquetas do artigo. Normalmente uma
readingMinutesnumberCalculado 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"
}
CampoO que éO que o Ocoya faz com ele
idO seu próprio identificador para o que acabou de criar — um id de linha, um id de documentoEnvia-o de volta para o seu delete URL como id. É por este que elimina.
urlO endereço onde publicouTorna-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ítulo300 caracteres
Corpo200 000 caracteres
Multimédia20 itens
Tempo limite30 segundos
CabeçalhosAté 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.

Relacionado