SEO Programático · Capítulo 11 de 21 · 29 min
Distribuir fora do site sem competir consigo mesmo
Republicar em plataformas de terceiros amplia o alcance quando a página original continua declarada como referência ao buscador.
Este capítulo faz parte do curso gratuito SEO Programático. Para marcar como concluído e salvar o progresso, abra este capítulo na página do curso.
Sindicar sem declarar a origem entrega ao domínio de outra empresa, quase sempre maior que o seu, o direito de aparecer na busca com o texto que você pagou para produzir. Sindicação (republicar a mesma peça em plataformas de terceiros, como uma coluna que sai em vários jornais) é distribuição barata quando a página original fica declarada como referência, e vazamento de ativo quando não fica.
O caso de abertura é um fracasso previsível. O roteiro antigo deste curso mandava publicar no Medium via API. O aluno chegava no passo de gerar o integration token e a plataforma simplesmente não emitia mais. O tutorial não estava errado quando foi escrito, envelheceu. E é esse envelhecimento silencioso, sem aviso, sem erro de compilação, sem alerta no painel, que faz de qualquer API de terceiro uma dependência de risco.
# Sonda executada em 19/07/2026. Rode você mesmo, leva dez segundos.
curl -s -i https://api.medium.com/v1/me
# HTTP/2 401
# {"errors":[{"message":"An access token is required.","code":6000}]}
curl -s -i https://api.medium.com/v1/me \
-H "Authorization: Bearer token-que-nao-existe"
# HTTP/2 401
# {"errors":[{"message":"Token was invalid.","code":6003}]}Leia essas duas respostas com cuidado, porque a interpretação preguiçosa leva ao diagnóstico errado nas duas direções.
O host está de pé. Ele diferencia ausência de token (código 6000) de token inválido (código 6003), o que só acontece quando existe camada de autenticação funcionando por trás. Uma API morta de verdade devolve 404, 410, DNS que não resolve ou timeout. Esta devolve erro bem formado.
Ao mesmo tempo, o repositório oficial Medium/medium-api-docs foi arquivado pelo proprietário em 02/03/2023, está em modo somente leitura, e exibe o aviso literal "The Medium API is no longer supported. We do not recommend using it." Sobre autenticação via navegador, o mesmo README declara "We don't allow any new integrations with our API." A emissão de novos integration tokens parou, com corte reportado em 1 de janeiro de 2025, e a documentação do n8n registra o mesmo comportamento: credenciais antigas continuam visíveis, novas integrações não podem ser configuradas.
O status correto tem três partes e nenhuma delas sozinha descreve a situação: oficialmente descontinuada, infraestrutura respondendo, fechada para novos usuários. Quem já tem token provavelmente ainda publica. Quem começa hoje não consegue a credencial, e portanto não tem projeto.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
O Hashnode envelheceu do mesmo jeito, por outro caminho. O changelog oficial de 13/05/2026 diz literalmente: "Reads used to be free. They aren't anymore. Queries against your publication now require Pro, the same as publishing." O Hashnode Pro foi lançado em 11/06/2026 como assinatura por publicação, com preço por assento, e desbloqueia domínio customizado, acesso à API GraphQL, modo headless, webhooks, backup no GitHub e importação em massa. Publicações que já usavam webhooks, domínio customizado ou backup no GitHub antes do lançamento mantiveram acesso por grandfathering. Consequência direta: qualquer material que apresente o Hashnode como opção gratuita de sindicação via API está errado desde 13/05/2026, inclusive material publicado esta semana que foi copiado de material antigo.
O DEV.to, rodando sobre o Forem, segue aberto e é o destino principal deste módulo. Base em https://dev.to/api, autenticação por header api-key gerado nas configurações da sua conta, e um header de versão que quase todo tutorial esquece: Accept: application/vnd.forem.api-v1+json.
Esse header não é decoração. A v0 está deprecada e será removida em release futura, então código que não declara a v1 está escrito contra uma superfície com data de validade. A sonda de 19/07/2026 em GET https://dev.to/api/articles retornou HTTP 200.
# Exemplo completo: publica no DEV.to com canonical para o seu domínio.
# Substitua DEVTO_API_KEY pela chave gerada em dev.to/settings/extensions.
curl -s -X POST https://dev.to/api/articles \
-H "api-key: $DEVTO_API_KEY" \
-H "Accept: application/vnd.forem.api-v1+json" \
-H "Content-Type: application/json" \
-d '{
"article": {
"title": "Gasolina no interior de SP: o que a semana da ANP mostrou",
"published": true,
"series": "Radar de Preço de Combustível",
"tags": ["brasil", "dados", "seo"],
"canonical_url": "https://seu-dominio.com.br/analises/2026-07-17-gasolina-interior-sp",
"body_markdown": "A série histórica semanal da ANP fechou na sexta.\n\nO preço médio da gasolina comum em Ribeirão Preto ficou em R$ X,XX...\n\nDados: ANP, série histórica de preços de combustíveis, coleta da semana de 12 a 18/07/2026."
}
}'
# Resposta esperada: HTTP 201 com o JSON do artigo criado,
# incluindo "id", "url" e o "canonical_url" que você enviou, ecoado de volta.
# Confira o eco: se ele voltar nulo, o canonical não foi aplicado.Duas coisas acontecem nesse 201 e as duas são o ponto da aula.
A primeira é que a peça passou a existir em dois lugares na web com o mesmo texto. A segunda é que o campo canonical_url declara qual dos dois é o original. Sem ele, você criou conteúdo duplicado e entregou a um domínio com autoridade muito maior que a sua o poder de ser escolhido como versão canônica. Com ele, você fez distribuição legítima.
Para atualizar a peça depois, e você vai precisar, porque dado semanal envelhece, o caminho é PUT /api/articles/{id} com o mesmo formato de corpo. O mesmo endpoint promove um rascunho para publicado, o que abre o fluxo que costuma ser o mais saudável: criar com published: false, revisar na interface, publicar depois.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
# Atualiza a peca ja publicada (corrige numero, promove rascunho, ajusta canonical).
# O {id} vem do campo "id" da resposta 201 do POST.
curl -s -X PUT https://dev.to/api/articles/1234567 \
-H "api-key: $DEVTO_API_KEY" \
-H "Accept: application/vnd.forem.api-v1+json" \
-H "Content-Type: application/json" \
-d '{
"article": {
"published": true,
"canonical_url": "https://seu-dominio.com.br/analises/2026-07-17-gasolina-interior-sp",
"body_markdown": "Versao corrigida com o dado da semana seguinte...\n"
}
}'
# Resposta esperada: HTTP 200 com o artigo atualizado.A página da v1 do Forem não documenta publicamente nenhum limite de taxa. Isso não significa que não exista, significa que você vai descobrir empiricamente, provavelmente em produção, provavelmente num lote. Trate como limite desconhecido: serialize as chamadas, respeite Retry-After quando vier, e implemente backoff exponencial com teto a partir do primeiro 429 ou 5xx. Publicar uma peça por semana não encosta em limite nenhum. Migrar cinquenta peças de acervo numa tarde encosta.
// sindicar.mjs - Node 22+, sem dependência externa (fetch nativo).
// Publica uma peça no DEV.to com canonical para o hub e backoff no erro.
const API = "https://dev.to/api/articles";
const KEY = process.env.DEVTO_API_KEY;
const HUB = "https://seu-dominio.com.br";
if (!KEY) throw new Error("Defina DEVTO_API_KEY no ambiente.");
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
async function publicar(peca, tentativa = 1) {
const resp = await fetch(API, {
method: "POST",
headers: {
"api-key": KEY,
Accept: "application/vnd.forem.api-v1+json",
"Content-Type": "application/json",
},
body: JSON.stringify({
article: {
title: peca.titulo,
published: true,
series: "Radar de Preço de Combustível",
tags: peca.tags,
// o canonical sempre aponta para o hub, nunca para o satelite
canonical_url: HUB + "/analises/" + peca.slug,
body_markdown: peca.markdown,
},
}),
});
if (resp.status === 201) {
const artigo = await resp.json();
if (artigo.canonical_url !== HUB + "/analises/" + peca.slug) {
throw new Error("Canonical nao foi ecoado como enviado: " + artigo.canonical_url);
}
return artigo;
}
// limite de taxa nao documentado: trate 429 e 5xx com backoff exponencial
if ((resp.status === 429 || resp.status >= 500) && tentativa <= 5) {
const cabecalho = Number(resp.headers.get("retry-after"));
const espera = Number.isFinite(cabecalho) && cabecalho > 0
? cabecalho * 1000
: Math.min(2 ** tentativa * 1000, 60000);
console.warn("HTTP " + resp.status + ", aguardando " + espera + "ms");
await sleep(espera);
return publicar(peca, tentativa + 1);
}
throw new Error("Falha " + resp.status + ": " + (await resp.text()));
}
const leituraSemanal = {
titulo: "Gasolina no interior de SP: o que a semana da ANP mostrou",
slug: "2026-07-17-gasolina-interior-sp",
tags: ["brasil", "dados", "seo"],
markdown: "A série histórica semanal da ANP fechou na sexta...",
};
const artigo = await publicar(leituraSemanal);
console.log("Publicado:", artigo.url, "| canonical:", artigo.canonical_url);Repare no que o script faz depois do 201: ele confere se o canonical_url voltou exatamente como foi enviado, e falha se não voltou. Essa verificação existe porque a falha de sindicação é silenciosa por natureza. A peça publica, o post fica bonito, você recebe curtidas, e o canonical simplesmente não está lá. Você só descobre semanas depois, quando a versão do satélite aparece na busca no lugar da sua.
Sobre o mecanismo de canonicalização em si, você já viu a hierarquia de sinais em [Gerar tudo e publicar só o que tem dado](#indexacao-seletiva-em-render) e ela não muda aqui. O que muda é o cenário: sindicação é o único caso em que a duplicação é deliberada e o canonical é a única declaração de qual cópia é o original. Tanto o canonical_url do DEV.to quanto o originalArticleURL da mutation publishPost do Hashnode, no endpoint https://gql.hashnode.com/, implementam o padrão correto.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
A geometria dessa figura carrega a decisão de arquitetura do módulo. O acervo é o ativo, e o acervo mora no hub. Os satélites são superfícies de distribuição alugadas, sujeitas a mudança unilateral de política, como o Medium e o Hashnode acabaram de demonstrar em janelas de dezoito meses. O valor de cada satélite nas respostas de IA também muda sem aviso: em agosto de 2026, a participação do Reddit nas citações do ChatGPT caiu de cerca de 3,83% para 0,52% em poucos dias, segundo a Promptwatch, enquanto no Google a queda foi gradual. A escolha de satélite é por plataforma e com data.
A régua prática de ligação, que sobreviveu de versões anteriores deste curso porque é barata e não depende de nenhuma tese: cada peça sindicada carrega dois a três links para peças relacionadas do seu acervo e ao menos um link para outra plataforma onde você publica. Isso dá ao leitor caminho de saída dentro do seu material, e dá ao rastreador mais de uma porta de entrada para o hub.
Uma ressalva que separa este curso do material de mercado. Circula a tese de que multiplicar fontes de publicação aumenta a chance de citação por motor generativo. É um mecanismo plausível, e há razão para achar que faça sentido: mais superfícies indexadas significam mais candidatos a entrar no conjunto de recuperação. Mas isso é raciocínio sobre o mecanismo, não resultado medido. Não existe estudo que isole a variável "sindicou em N plataformas" e meça o efeito sobre citação. Sindique porque distribui conteúdo para leitores reais e porque o custo marginal é próximo de zero depois que o script existe. Se você vender a um cliente que sindicar garante citação em LLM, está vendendo o que não pode entregar.
Etapa do projeto Radar. Sua entrega neste módulo tem duas partes.
Parte 1, a peça sindicada. Escreva uma leitura semanal do movimento de preços, derivada do acervo que você já tem: o que subiu, o que caiu, qual município destoou da média do estado, sempre citando a série histórica semanal da ANP como fonte, com a semana de coleta explícita. Publique via API do DEV.to com canonical_url apontando para a versão no seu domínio, que precisa existir e responder 200 antes de você rodar o script.
Parte 2, o mapa de hub e satélites. Documente, num arquivo do repositório, para cada destino que você considerou: nome, estado do acesso na data em que você verificou, custo de entrada, se aceita canonical e por qual campo, e a data da verificação. Esse arquivo tem data porque vai envelhecer, e a data é o que permite saber quando ele envelheceu.
Critérios de aceite
- A peça publicada no satélite retorna
canonical_urligual à URL do hub, conferido na resposta da API e não na interface. - A URL do hub responde 200 e é a mesma que está no seu sitemap, sem redirecionamento no meio.
- A peça carrega de dois a três links internos e ao menos um link para outra plataforma sua.
- O mapa de destinos tem data de verificação por linha.
Antes de aprovar qualquer plano de sindicação, cobre quatro respostas de quem executa. Qual destino é usado hoje e por qual campo o canonical é declarado (no DEV.to, canonical_url). O que impede os destinos descartados, verificado na documentação oficial e numa sonda HTTP, e não em tutorial. O que acontece na indexação se o canonical faltar, e qual verificação no script pega o erro no mesmo minuto. E, se alguém prometer citação em IA por sindicar em cinco plataformas, qual estudo isola esse efeito, porque nenhum isolou até aqui.
O guia abaixo serve a quem aprova distribuição fora do site próprio, seja o CMO que ouviu a proposta da agência, seja o gerente de conteúdo que vai operar. Ele destrava uma decisão: sindicar, com quais satélites e sob qual controle.
Guia de implementação: sindicar sem perder a autoria
Cinco passos, do mapa de destinos à revisão trimestral.
Passo 1: Montar o mapa de hub e satélites com data
Liste cada destino com estado de acesso, custo de entrada, campo de canonical e data da checagem.
Deu certo quando: Toda linha do mapa tem data de verificação e campo de canonical nomeado.
Erro comum: Copiar a lista de destinos de um tutorial antigo sem checar se a API ainda aceita novos usuários.
Passo 2: Sondar a API antes de escrever código
Confira documentação oficial, changelog, emissão de credencial nova e uma chamada HTTP de teste.
Deu certo quando: As quatro checagens estão registradas com resultado e data.
Erro comum: Ler um 401 bem formado como prova de que a API serve para quem começa hoje.
Passo 3: Publicar primeiro no hub
A peça original existe no seu domínio, responde 200 e está no sitemap antes de qualquer cópia.
Deu certo quando: A URL do hub responde 200 sem redirecionamento no meio.
Erro comum: Sindicar uma URL que ainda não existe ou que redireciona.
Passo 4: Sindicar com verificação automática do canonical
O script confere se o canonical voltou na resposta da API exatamente como foi enviado.
Deu certo quando: O script falha na hora quando o eco do canonical vem nulo ou diferente.
Erro comum: Conferir o canonical só na interface da plataforma, semanas depois.
Passo 5: Revisar os destinos a cada trimestre
Repita as quatro checagens por destino e atualize a data no mapa.
Deu certo quando: Existe lembrete no calendário e o mapa mostra a revisão do trimestre.
Erro comum: Descobrir que a plataforma fechou só quando o pipeline quebra.
No fim você tem: Uma rotina de distribuição em que cada cópia declara a origem, cada destino tem data de verificação e nenhuma dependência de terceiro morre em silêncio.
Quem faz, quanto custa, como conferir
| Etapa | Quem faz | Prazo e esforço | Como conferir |
|---|---|---|---|
| Mapa de hub e satélites | Gerente de conteúdo | Meio dia; sem custo de licença | Arquivo com uma linha datada por destino |
| Sonda da API | Desenvolvedor | 1 hora por destino | Quatro checagens registradas com resultado |
| Publicação no hub | Gerente de conteúdo | Rotina semanal já existente | URL responde 200 e consta do sitemap |
| Script com verificação do canonical | Desenvolvedor | 1 a 2 dias na primeira vez | Teste com canonical errado faz o script falhar |
| Revisão trimestral | Analista de SEO | 2 horas por trimestre | Data da revisão atualizada no mapa |
Peça hoje o mapa de destinos com data por linha e o resultado da sonda de cada API. Confira na primeira peça sindicada: a resposta da API precisa ecoar o canonical_url igual à URL do hub, e essa URL precisa responder 200. Se em três meses o mapa não tiver revisão datada, suspenda a sindicação até ela existir.
Perguntas frequentes deste capítulo
Sindicar com canonical apontando para o meu domínio ainda conta como conteúdo duplicado?
Consigo publicar no Medium se eu já tiver um integration token antigo?
Vale a pena pagar o Hashnode Pro só para sindicar?
Por que o header Accept com a versão importa tanto se a chamada funciona sem ele?
Como eu sei que uma API que uso hoje não vai fechar como o Medium fechou?
Seu caderno neste capítulo
Abrir o caderno completoSelecione um trecho do capítulo para destacar ou anotar. Nos vídeos e áudios, use Anotar este momento. No teclado, selecione com Shift e as setas e use Alt+Shift+D para destacar ou Alt+Shift+N para anotar.
Salvo neste navegador. Entre na sua conta para levar o caderno a outros aparelhos.
Entre na sua conta para compartilhar o que aprendeu e convidar alguém para estudar com você.
Conexões deste capítulo
Explore os conceitos e compare abordagens em outros cursos. As conexões indicam assuntos relacionados; a sequência de estudo continua no índice do curso.
O mesmo assunto em outros cursos
- Autoridade Temática e SEO de EntidadesComo parar de competir com o seu próprio siteExaminar conexões de Como parar de competir com o seu próprio site
- GEO Universal FrameworkImpeça que páginas do mesmo site disputem a buscaExaminar conexões de Impeça que páginas do mesmo site disputem a busca
- E-E-A-T e Qualidade de ConteúdoO que mudou entre 2023 e 2026, e o que custou a quem ignorouExaminar conexões de O que mudou entre 2023 e 2026, e o que custou a quem ignorou
Voltar ao capítulo anterior: Gerar tudo e publicar só o que tem dado
Capítulos vizinhos em SEO Programático
- 09Medir o template contra as melhores páginas do assunto
- 10Gerar tudo e publicar só o que tem dado
- 11Distribuir fora do site sem competir consigo mesmo
- 12Medir a cauda do acervo com Search Console e BigQuery
- 13Separar o que funciona em IA do que é fumaça