Se você tem 30 segundos (TL;DR)
- AEO é o trabalho de fazer uma página ser citada em respostas de IA, além de ranquear. O checklist AEO tem 12 itens verificáveis. O script faz checagens automáticas em 9 deles, várias parciais. Os outros 3 dependem de leitura.
- Ranking e citação são dois filtros separados. Passar no primeiro não garante o segundo.
- Mover a definição para as primeiras 50 palavras rende mais que qualquer ajuste de palavra-chave.
- No estudo GEO, encher o texto com palavra-chave baixou a visibilidade. Números com fonte e citações diretas aumentaram a visibilidade.
- Antes do texto, confira a parte técnica: a página precisa estar indexada, exibir snippet e permitir o rastreamento no robots.txt. A medição sugerida aqui cobre só a Busca do Google.
O que o AEO otimiza
AEO (Answer Engine Optimization) significa otimização para engines de resposta. O Google chama esse trabalho de AEO ou GEO. Para o Google, isso continua sendo SEO.
Pense no AEO como arrumar a vitrine de uma padaria. O ranking põe a padaria na rua por onde o cliente passa. A citação acontece quando o cliente olha a vitrine e escolhe um pão já pronto. O sistema de IA age como esse cliente com pressa: ele lê o conteúdo exposto e não entra na cozinha para procurar.
A página que ranqueia já está na rua certa. O checklist AEO cuida do que fica exposto na vitrine.
O caminho da pergunta até a citação

O guia do Google para busca com IA generativa descreve dois mecanismos. O primeiro é a geração aumentada por recuperação (RAG). Os sistemas de ranking buscam páginas no índice. Depois o sistema revisa a informação específica de cada página e gera a resposta com links.
O segundo é o fan-out. O modelo dispara consultas relacionadas em paralelo para buscar mais resultados. O exemplo do guia parte de uma consulta ampla e gera as subconsultas do desenho.
O SEO clássico cuida do filtro 1. Se a página foi recuperada para compor a resposta, a ausência de citação pode estar no segundo filtro. Ranquear na consulta original não comprova essa recuperação. O checklist AEO mira esse segundo filtro.
Teste o filtro 1 nas subconsultas
O fan-out busca subconsultas diferentes da consulta em que a página ranqueia. Nessas subconsultas, a página pode cair no filtro 1 e nem chegar ao filtro 2. Reescrever a definição, como pede o checklist AEO, não resolve quando a página cai no primeiro filtro.

Rode esse teste no Google Search Console antes de aplicar o checklist AEO. Uma variação sem impressões também pode ser uma consulta sem volume no período.
As variações escritas por você são uma estimativa. O modelo pode gerar outras subconsultas, e o teste não mostra quais. Ele descarta o caso em que a página nem aparece para as variações óbvias, antes de você gastar tempo com o checklist AEO.
O efeito do texto por posição no ranking
| Método do estudo GEO | Fonte na posição 1 do Google | Fonte na posição 5 do Google |
|---|---|---|
| Cite Sources | -30,3% | +115,1% |
| Quotation Addition | -22,9% | +99,7% |
| Statistics Addition | -20,6% | +97,9% |
A tabela vem do estudo GEO, de Aggarwal e coautores. Os autores montaram uma engine generativa com as 5 primeiras páginas do Google para cada consulta. O ranking seleciona as cinco fontes; entre as fontes já selecionadas, o experimento avalia o efeito das alterações de texto. Um modelo gerava a resposta e citava essas fontes.
Nesse experimento, todas as fontes foram otimizadas simultaneamente. Os valores mostram a variação média de visibilidade por posição original no Google. Com Cite Sources, a fonte na posição 5 ganhou 115,1%. Quando a fonte na posição 1 aplicou o método junto com as outras, perdeu 30,3%.
A tabela indica que o texto altera a parcela de uma página que já chegou ao modelo, ou seja, age no filtro 2. O sinal desse efeito mudou com a posição da fonte.
O que o estudo GEO mediu
| Método | O que muda no texto | Engine do estudo | Perplexity |
|---|---|---|---|
| Sem otimização | nada | 19,3 | 24,1 |
| Keyword Stuffing | mais palavras da consulta | 17,7 | 21,9 |
| Cite Sources | cita fontes confiáveis | 24,6 | 26,8 |
| Statistics Addition | troca discussão por número | 25,2 | 26,2 |
| Quotation Addition | adiciona citação direta | 27,2 | 29,1 |
Os dados vêm das tabelas 1 e 7 do estudo GEO. A métrica é a contagem de palavras ajustada pela posição. Ela mede quanto da resposta vem de cada fonte e dá mais peso às frases do começo da resposta. No Perplexity, os autores rodaram 200 consultas com arquivos enviados, com respostas limitadas a esses arquivos.
O Keyword Stuffing ficou abaixo da linha de base nas duas engines. No Perplexity, caiu de 24,1 para 21,9. O guia do Google trata de outro ponto. Ele diz que variações de cauda longa não são necessárias, porque os sistemas de IA entendem sinônimos. O guia não afirma que excesso de palavra-chave reduz a visibilidade.
Gastar tempo com densidade de palavra-chave numa página que já ranqueia é desperdício. Por isso o checklist AEO não tem item de densidade.
O estudo mede a posição da frase na resposta gerada, e não a posição da definição na sua página. A regra das 50 palavras do checklist AEO é uma aposta prática minha e não tem medição publicada.
O checklist AEO com 12 itens
A coluna “Base” do checklist AEO separa o que tem fonte do que é aposta minha. Os itens 1, 3, 4 e 5 são a aposta. Os itens 2, 8, 9 e 10 vêm de guias do Google sobre conteúdo útil e datas de byline. Nenhum desses guias mede citação em resposta de IA.
O item 11 e a liberação do Googlebot no item 12 são requisitos documentados para a página entrar no índice com snippet no Google. A permissão ao OAI-SearchBot trata do acesso para a busca do ChatGPT. Eles tratam do acesso e da elegibilidade, e não da citação. Só os itens 6 e 7 têm evidência ligada ao filtro 2. Essa evidência vem de um único estudo com gpt-3.5-turbo, sem réplica verificada.
O Google afirma que não é preciso picotar o conteúdo nem reescrever para IA. Concordo em parte. Definição no topo, item 1 do checklist AEO, atende primeiro ao leitor humano, e o mesmo guia pede páginas organizadas e fáceis de seguir.
Rode a auditoria automática
Arquivo auditoria_aeo.py:
import re
import sys
import urllib.robotparser
from urllib.parse import urljoin, urlparse
import requests
from bs4 import BeautifulSoup
MAX_WORDS_TO_DEFINITION = 50
MAX_ANSWER_WORDS = 60
BOTS = ("Googlebot", "OAI-SearchBot")
# Wikipedia, and many other sites, answer 403 to the default agent of requests
# and of urllib. Both requests here send this header.
HEADERS = {"User-Agent": "Mozilla/5.0"}
# Portuguese definition verbs, escaped to keep the file ASCII.
DEFINITION_VERB = re.compile(r"\b(\u00e9|s\u00e3o|significa|define|consiste)\b", re.IGNORECASE)
DATE_LABEL = re.compile(r"\b(publicado|atualizado)\b", re.IGNORECASE)
LD_DATE = re.compile(r'"(datePublished|dateModified)"\s*:\s*"(\d{4}-\d{2}-\d{2})')
AUTHOR_LINK = 'a[rel~="author"][href], .author a[href], .byline a[href], [itemprop="author"] a[href]'
def count_words(text):
return len(re.findall(r"\w+", text))
def normalize(text):
return " ".join(text.split())
def find_definition(paragraphs, term):
total = 0
for sentence in re.split(r"(?<=[.!?])\s+", " ".join(paragraphs)):
total += count_words(sentence)
if term.lower() in sentence.lower() and DEFINITION_VERB.search(sentence):
return total, normalize(sentence)
return None, None
def report(item, passed, detail):
print(f"[{'OK' if passed else 'FALHA'}] {item:>2} {detail}")
def has_external_link(paragraph, host):
return any(urlparse(a.get("href", "")).netloc not in ("", host) for a in paragraph.find_all("a"))
def audit(url, term):
soup = BeautifulSoup(requests.get(url, timeout=15, headers=HEADERS).text, "html.parser")
body = soup.find("article") or soup.body
paragraphs = body.find_all("p")
headings = body.find_all("h2")
host = urlparse(url).netloc
position, definition = find_definition([p.get_text(" ", strip=True) for p in paragraphs], term)
report(1, position is not None and position <= MAX_WORDS_TO_DEFINITION,
f"definicao termina na palavra {position}")
questions = [h for h in headings if h.get_text(strip=True).endswith("?")]
report(3, bool(headings) and len(questions) == len(headings),
f"{len(questions)} de {len(headings)} H2 em forma de pergunta")
long_answers = [h.get_text(strip=True) for h in headings
if (p := h.find_next("p")) and count_words(p.get_text()) > MAX_ANSWER_WORDS]
report(5, not long_answers, f"respostas longas: {long_answers}")
cited = [p for p in paragraphs if re.search(r"\d", p.get_text()) and has_external_link(p, host)]
report(6, bool(cited), f"{len(cited)} paragrafos com numero e fonte externa")
author_link = soup.select_one(AUTHOR_LINK)
report(8, author_link is not None,
f"link de autoria: {author_link['href']}" if author_link else "sem link de autoria")
time_tag = soup.find("time", datetime=True)
visible = time_tag["datetime"][:10] if time_tag else None
labeled = time_tag is not None and bool(DATE_LABEL.search(time_tag.parent.get_text(" ", strip=True)))
report(9, labeled, f"data no atributo datetime: {visible}, rotulo Publicado/Atualizado: {labeled}")
ld_dates = dict(m.groups() for s in soup.find_all("script", type="application/ld+json")
for m in LD_DATE.finditer(s.string or ""))
report(10, visible in ld_dates.values(), f"JSON-LD: {ld_dates} vs datetime: {visible}")
meta = " ".join(m.get("content", "") for m in soup.find_all("meta", attrs={"name": "robots"})).lower()
blocks = [normalize(el.get_text(" ", strip=True)) for el in soup.select("[data-nosnippet]")]
hidden = definition is not None and any(b and (definition in b or b in definition) for b in blocks)
blocked = "noindex" in meta or "nosnippet" in meta or hidden
detail = "sem definicao para conferir" if definition is None else f"definicao em data-nosnippet: {hidden}"
report(11, not blocked, f"meta robots: '{meta}', {detail}")
# robots.read() uses urllib, which sends no header and receives 403. A
# RobotFileParser on a 403 answers False to every bot, so the item would
# report a block that does not exist.
robots = urllib.robotparser.RobotFileParser()
robots.parse(requests.get(urljoin(url, "/robots.txt"), timeout=15, headers=HEADERS).text.splitlines())
for bot in BOTS:
report(12, robots.can_fetch(bot, url), f"{bot} liberado no robots.txt")
if __name__ == "__main__":
audit(sys.argv[1], sys.argv[2])
Para rodar:
$ pip install requests beautifulsoup4
$ python auditoria_aeo.py https://example.com/sua-pagina "termo central"
No item 1 do checklist AEO, o script procura a primeira frase com o termo e um verbo de definição nos parágrafos. A contagem considera só os parágrafos. Uma definição sem esses verbos gera falso negativo, então confira por leitura se o item 1 falhar.
No item 8, o script encontra o link na assinatura sem validar para onde ele aponta. Clique nele para checar se leva à página correta. No item 9, ele localiza o rótulo perto da data, mas não verifica como esse elemento está destacado visualmente.
No item 10, o script compara o atributo datetime com o JSON-LD, mas não lê a data exibida para o leitor. Confira essa data por leitura:
| O que verificar | Por quê? | Onde está? |
|---|---|---|
| A data exibida ao usuário | Ela não é lida automaticamente pelo script | No JSON-LD vs atributo datetime |
No item 11, a checagem é parcial: ele lê a meta tag robots no HTML, mas ignora cabeçalhos HTTP e diretivas específicas para Googlebot.
No item 12, o script baixa o robots.txt com o mesmo cabeçalho do resto. Se o servidor recusar esse pedido, o resultado do item perde valor. Abra o robots.txt no navegador para conferir o arquivo diretamente.
Use um prompt nos itens de leitura
Os itens 2, 4 e 7 do checklist AEO dependem de julgamento. Vamos passar esses itens para um modelo e revisar a resposta dele.
Leia o texto abaixo. Responda em três blocos numerados, sem comentário extra.
1. Copie a primeira frase que define "{termo}". Informe quantas palavras vêm antes dela.
2. Para cada H2, diga "sim" ou "não": a primeira frase depois dele responde a pergunta do H2?
3. Liste cada citação direta e o nome da fonte atribuída. Se não houver, escreva "nenhuma".
Depois, avalie o H1 em uma linha: ele resume o conteúdo sem exagero?
Texto:
{texto}
Trate a saída do modelo como rascunho de revisão do checklist AEO. O modelo pode errar a contagem de palavras, então o script continua valendo para o item 1.
Corrija na ordem dos filtros

A ordem do checklist AEO segue os filtros do primeiro desenho. O Google só usa como link de apoio uma página indexada e elegível para exibir snippet. O guia de 2026 acrescenta um requisito: o site precisa estar incluído nos recursos de IA generativa da Busca, no Search Console.
Para limitar o que aparece da página, o Google usa nosnippet, data-nosnippet, max-snippet e noindex. Um data-nosnippet esquecido na introdução impede o uso do trecho nas exibições que esse controle cobre. O item 11 do checklist AEO pega esse caso.
A documentação de robôs da OpenAI separa busca de treino. Um site que bloqueia o OAI-SearchBot não aparece nas respostas de busca do ChatGPT, embora ainda possa aparecer como link de navegação. O GPTBot controla só o uso em treino, e as duas regras são independentes. Depois de mudar o robots.txt, a busca do ChatGPT pode levar cerca de 24 horas para se ajustar.
Publique data e autoria legíveis
<article>
<p class="byline">
Por <a rel="author" href="/autor/nome-do-autor">Nome do Autor</a>.
<time datetime="2026-09-22">Atualizado em 22 de setembro de 2026</time>
</p>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "O checklist AEO para auditar uma página",
"datePublished": "2026-09-22T08:00:00-03:00",
"dateModified": "2026-09-22T08:00:00-03:00",
"author": {"@type": "Person", "name": "Nome do Autor", "url": "https://example.com/autor/nome-do-autor"}
}
</script>
</article>
As regras de data do Google, base dos itens 9 e 10 do checklist AEO, pedem uma data visível, em destaque e rotulada. A data visível e a do JSON-LD precisam coincidir. Não use data futura nem a data do evento descrito na página. Se o Google escolher a data errada, reduza as outras datas do documento.
O guia de conteúdo útil recomenda assinatura visível que leve à página com informações do autor. Revise também por leitura se a atualização corresponde a uma mudança substancial no conteúdo.
O que o Google sugere ignorar
O guia de 2026 lista o que não ajuda na Busca do Google:
Arquivos llms.txt e marcações especiais: sem efeito, pois a Busca os ignora;
Dados estruturados: não são requisito para recursos de IA;
Menções inautênticas: buscar tais citações não é tão útil quanto pode parecer.
A frase do Google vale para a Busca, e não para o llms.txt em geral. Agentes usam o arquivo, e já escrevi sobre quais páginas colocar no llms.txt se um LLM só puder ler 5. A própria OpenAI publica um arquivo desse tipo.
A dúvida está nas engines de busca. O Google diz que ignora o llms.txt, e não encontrei evidência de que outra engine use o arquivo para recuperar ou citar páginas. O checklist AEO mira os dois filtros da busca, então ele não traz item de llms.txt. Mantenha o arquivo para os agentes e não espere ganho de citação na busca por causa dele.
Meça com uma página de controle
antes da correção depois da correção
página A relatório de IA relatório de IA <-- corrigida
página B relatório de IA relatório de IA <-- controle, sem mudança
Para medir o resultado do checklist AEO, use o relatório de desempenho de IA generativa do Search Console antes e depois da intervenção. Esse relatório cobre só a Busca do Google. Não tenho um método equivalente para medir citações no ChatGPT ou no Perplexity.
Comparar antes e depois sem controle mistura o efeito da edição com mudanças de engine ou de demanda. Escolha duas páginas parecidas, altere uma e mantenha a outra intacta no mesmo intervalo. O controle reduz esse ruído, mas duas páginas não provam causalidade estrita.
Comece pela página de maior tráfego
1. rode auditoria_aeo.py na pagina de maior trafego do site
2. item 12 ou 11 com FALHA? corrija esses dois antes de mexer no texto
3. escolha uma pagina parecida como controle e nao mexa nela
4. anote o relatorio de IA do Search Console das duas paginas
5. corrija o item 1 na pagina auditada
6. rode o script de novo e compare as duas paginas no mesmo intervalo
Os itens 12 e 11 vêm primeiro porque decidem se a página chega ao modelo. Sem acesso do robô e sem snippet, nenhuma edição de texto passa do filtro 1.
Com os dois liberados, eu arrumaria o item 1 do checklist AEO: a definição do termo central nas primeiras 50 palavras do corpo. Pegue o termo que a página explica e escreva o que ele é, com verbo de definição, antes de qualquer contexto. A seção “O que o AEO otimiza” faz isso na primeira frase: “AEO significa otimização para engines de resposta.”
O item 1 é aposta minha, sem medição publicada. A página de controle mostra se eu errei.
Tabelas 1 e 7 estudo GEO
Fontes
- Google Search Central, Optimizing your website for generative AI features on Google Search
- Google Search Central, AI features and your website
- Aggarwal et al., GEO: Generative Engine Optimization (KDD 2024)
- Google Search Central, Creating helpful, reliable, people-first content
- Google Search Central, Influence your byline dates in Google Search
- OpenAI, Overview of OpenAI Crawlers
- Fogo na Caixa d’Agua, Se um LLM só puder ler 5 páginas do seu site, quais seriam?







Deixe um comentário