Pesquisa
Transforme uma consulta de busca em briefing de conteúdo SEO
Veja quais páginas respondem à consulta hoje, leia-as como Markdown, mapeie as perguntas que respondem e as que ignoram e escreva um briefing do qual o redator possa tirar o esboço.
Copiar o prompt
Substitua os campos entre colchetes e cole no Claude Code, Codex ou qualquer IA com acesso ao terminal. Ela instala a skill da Felo, pergunta antes de gastar créditos e executa o fluxo.
Escreva um briefing de conteúdo SEO para a consulta [consulta alvo] para [produto ou site]. Público: [leitor]. Mercado e idioma: [região], [idioma]. Ângulo: [guia / comparação / página de produto]. Decisão que ele apoia: [artigo novo / atualização / cobrir lacuna]. Leia o que responde hoje a essa consulta antes de propor o esqueleto. Produza um briefing em Markdown com: 1. A consulta alvo e a intenção que você infere, com a evidência dessa leitura. 2. O que as páginas atuais cobrem: título, URL e seções de abertura. 3. Perguntas que as páginas atuais respondem e perguntas que elas perdem. 4. Um esqueleto proposto com uma linha por seção dizendo o que ela precisa provar. 5. Evidências e exemplos das fontes, com links. 6. Uma lista completa de fontes. Regras: - Não afirme volume de busca, dificuldade de palavra-chave, posição ou tráfego. Este fluxo não mede isso; escreva “Não medido aqui” em vez de um número. - Não invente estatísticas, citações ou afirmações sobre o conteúdo de concorrentes. - Descreva a intenção como leitura das páginas, não como fato medido. - Mantenha citações curtas, atribuídas e com link. - Transforme a região e o idioma em valores explícitos. - Antes de gastar créditos, mostre as chamadas de API planejadas e aguarde minha aprovação. - Não publique, agende nem envie nada. - Grave o resultado em ./seo-brief.md e resuma no chat.
A cópia também inclui os passos de instalação e as regras de segurança.
O que você recebe
Saída de exemplo de uma execução. Não é geração ao vivo.
Briefing de SEO — “como automatizar a triagem de suporte”
Consulta alvo e intenção
Consulta: “como automatizar a triagem de suporte”. As páginas retornadas começam com etapas de implementação, não páginas de produto, então a intenção lê-se como how-to. É uma leitura das páginas, não um rótulo de intenção medido.
O que as páginas atuais cobrem
| Página | URL | Começa com |
|---|---|---|
| Automatizar a triagem de suporte: guia prático | https://example.com/guide | Regras de roteamento e depois tags |
| Checklist de automação da triagem | https://example.com/checklist | A própria checklist |
Perguntas que as páginas respondem
- O que a automação da triagem muda
- Com quais regras de roteamento começar
Perguntas que faltam
- Como medir se a triagem realmente melhorou
- O que fazer quando o classificador erra
Estrutura proposta
- O que a automação da triagem muda — provar que é sobre a fila, não o quadro.
- As três primeiras regras de roteamento que valem automação — provar cada uma com exemplo.
- Como medir no primeiro mês — provar com métrica que um líder de ops consiga tirar.
- Quando a automação erra — provar o caminho de fallback humano.
Evidência
- Exemplo de regra de roteamento, citado de https://example.com/guide (verificado em 2026-10-30)
Não medido aqui
Volume de busca, dificuldade de palavra-chave e posição. Este fluxo lê páginas públicas; não consulta índice de busca nem rastreador de posição.
Fontes
- https://example.com/guide
- https://example.com/checklist
As chamadas exatas
Para desenvolvedores: o mesmo fluxo em código, na ordem de execução.
Mostrar as chamadas reais da API
Veja quem responde hoje
Pergunte ao Chat sobre a consulta e obtenha a resposta e as páginas citadas. Essas páginas são o conteúdo concorrente atual.
seo-brief.ts const BASE = "https://openapi.felo.ai"; const headers = { Authorization: `Bearer ${process.env.FELO_API_KEY}`, "Content-Type": "application/json", }; async function felo<T>(path: string, body?: unknown): Promise<T> { const res = await fetch(`${BASE}${path}`, { method: body ? "POST" : "GET", headers, body: body ? JSON.stringify(body) : undefined, }); if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`); return res.json() as Promise<T>; } type ChatData = { data: { answer: string; resources: { link: string; title: string; snippet: string }[]; }; }; const query = "how to automate support triage"; const ourSite = "example.com"; const coverage = await felo<ChatData>("/v2/chat", { query: `What pages currently answer the search query "${query}"? List the pages and what each one covers.`, }); const candidates = coverage.data.resources .filter((resource) => !resource.link.includes(ourSite)) .slice(0, 5) .map((resource) => ({ url: resource.link, title: resource.title }));Saída de exemplo
{ "answer": "Readers searching this usually want a step-by-step …", "sources": [ { "link": "https://example.com/guide", "title": "…", "snippet": "…" } ] }Leia as páginas em Markdown
Baixe as três a cinco páginas mais fortes com Web Fetch em Markdown, mantendo títulos e perguntas.
seo-brief.ts type ExtractData = { data: { content: string } }; const pages = await Promise.all( candidates.map(async (page) => { const res = await felo<ExtractData>("/v2/web/extract", { url: page.url, output_format: "markdown", with_readability: true, with_cache: true, }); const checkedAt = new Date().toISOString().slice(0, 10); return { ...page, checkedAt, content: res.data.content }; }), );Saída de exemplo
{ "url": "https://example.com/guide", "checkedAt": "2026-10-30", "content": "# Automating support triage\n\n## Routing rules\n…" }Mapeie cobertura e lacunas
Extraia os H2/H3 e as perguntas de FAQ de cada página e monte uma tabela: quais perguntas são respondidas e quais não são.
seo-brief.ts type Heading = { page: string; heading: string }; const headings: Heading[] = pages.flatMap((page) => page.content .split("\n") .filter((line) => line.startsWith("## ")) .map((line) => ({ page: page.title, heading: line.replace(/^##\s+/, ""), })), ); const questions = headings.filter((item) => item.heading.includes("?")); const byTopic = new Map<string, string[]>(); for (const item of headings) { byTopic.set(item.heading, [...(byTopic.get(item.heading) ?? []), item.page]); }Saída de exemplo
// questions [ { "page": "…", "heading": "What routes should you automate first?" } ]Escreva o briefing
Descreva consulta-alvo, intenção, comparação de cobertura, perguntas ausentes, esboço sugerido e lista de fontes.
seo-brief.ts const today = new Date().toISOString().slice(0, 10); const brief = [ `# SEO brief — "${query}"`, `Checked ${today}. Site: ${ourSite}.`, "", "## Intent read", "The pages returned for this query lead with: " + headings.slice(0, 6).map((item) => item.heading).join("; ") + ". This is a reading of their structure, not a measured intent label.", "", "## What the pages cover", "| Page | URL | Checked |", "| --- | --- | --- |", ...pages.map((page) => `| ${page.title} | ${page.url} | ${page.checkedAt} |`), "", "## Questions the pages answer", ...questions.map((item) => `- ${item.heading} (${item.page})`), "", "## Topics more than one page covers", ...[byTopic.entries()] .filter(([, pageTitles]) => pageTitles.length > 1) .map(([heading, pageTitles]) => `- ${heading} (${pageTitles.length} pages)`), "", "## Proposed outline", ...questions.slice(0, 5).map((item, index) => `${index + 1}. ${item.heading}`), "", "## Questions they miss", "<!-- Only questions none of the fetched pages answer. Delete this comment when filled. -->", "", "## Not measured here", "Search volume, keyword difficulty, and ranking position. This workflow reads public pages; it does not query a search index or a rank tracker.", "", "## Sources", ...pages.map((page) => `- ${page.title}: ${page.url}`), ].join("\n"); console.log(brief);Saída de exemplo
# SEO brief — "how to automate support triage"
Salve no LiveDoc
Salve o briefing e os links das páginas no LiveDoc para a próxima atualização baixar só o que mudou.
seo-brief.ts type LiveDocData = { data: { short_id: string } }; const briefDoc = await felo<LiveDocData>("/v2/livedocs", { name: `SEO briefs: ${ourSite}`, description: "One document resource per target query", }); await felo(`/v2/livedocs/${briefDoc.data.short_id}/resources/urls`, { urls: pages.map((page) => ({ url: page.url, title: page.title })), }); await felo(`/v2/livedocs/${briefDoc.data.short_id}/resources/doc`, { title: `SEO brief — ${query}`, content: brief, }); console.log(briefDoc.data.short_id); // the next query adds to this archiveSaída de exemplo
{ "short_id": "PvyKouzJirXjFdst4uKRK3" }
O que está incluído
- Lista de páginas com fontes do Chat e links da resposta
- Páginas mais bem posicionadas hoje em Markdown
- Títulos e perguntas que essas páginas cobrem
- Briefing do qual dá para tirar o esboço imediatamente
- LiveDoc com fontes para a próxima atualização
O que não faz
- Não mede posições, volume de busca, dificuldade de palavra-chave ou tráfego
- Somente páginas públicas; login e paywall podem falhar
- Não publica nem reescreve o artigo inteiro
- Uma execução por consulta; várias consultas exigem seu próprio loop
- Não garante posições
Perguntas
Ele mede volume de busca ou posições?
Não. Ele lê páginas públicas e avalia qual conteúdo responde à consulta hoje; posições e volume ficam com suas ferramentas de SEO.
De onde vêm os dados?
O Chat devolve páginas com fontes e o Web Fetch as transforma em Markdown. Cada avaliação no briefing aponta para uma página e data específicas.
Posso tratar várias consultas?
Sim, mas uma por vez. Para várias, repita os passos para cada consulta e salve briefings separados.
Para que tipo de consulta serve?
Consultas informacionais, comparativas e de “como fazer”, porque páginas públicas dão sinal suficiente. Consultas transacionais ainda precisam dos seus dados de produto e conversão.
Ele escreve o artigo?
Não. Ele entrega o briefing e o esboço; a escrita fica com o editor ou seu agent de escrita.
Quanto custa uma execução?
Chat e extração de páginas gastam créditos por uso; as tarifas atuais estão na página de preços. O prompt pede aprovação antes de gastar.
Fluxos relacionados
Transforme uma pergunta em um briefing de pesquisa com fontes
Pergunte à web, salve as páginas por trás da resposta como Markdown, adicione o que os praticantes dizem no X e mantenha as evidências em um LiveDoc que você pode consultar depois.
Abrir o fluxo de trabalhoConteúdoPreencha um mês de conteúdo com as perguntas da sua audiência
Mapeie temas no Chat, encontre as perguntas da audiência no X, pegue um ângulo real de uma transcrição de vídeo e monte um calendário de quatro semanas em que cada linha nomeia sua evidência.
Abrir o fluxo de trabalhoConteúdoPublique um resumo diário de IA que a equipe realmente lê
Obtenha um resumo com fontes, adicione o que os praticantes publicam no X, pegue uma transcrição de vídeo, monte a edição em Markdown e arquive no LiveDoc.
Abrir o fluxo de trabalhoFaça do seu jeito
A mesma receita, adaptada ao seu processo real.
Só consultas comparativas
Limite a “X vs Y” e “melhor X” para enxergar melhor o ângulo de diferenciação.
Adicione sua página de produto
Inclua a página do produto como fonte extra para o esboço aterrissar nos seus recursos e preços.
Atualize a cada trimestre
Rode de novo no mesmo LiveDoc e observe como as páginas concorrentes e o esboço mudam.
Continue
As páginas de referência por trás desta receita e para onde ir depois.