Investigación
Convierte una búsqueda en un brief de contenido SEO
Mira qué páginas responden hoy, léelas como Markdown, mapea las preguntas que cubren y las que omiten, y escribe un brief del que el redactor pueda sacar el esquema.
Copiar el prompt
Sustituye los campos entre corchetes y pégalo en Claude Code, Codex o cualquier IA con acceso a terminal. Instala el skill de Felo, pregunta antes de gastar créditos y ejecuta el flujo.
Escribe un brief de contenido SEO para la consulta [consulta objetivo] para [producto o sitio]. Audiencia: [lector]. Mercado e idioma: [región], [idioma]. Enfoque: [guía / comparativa / página de producto]. Decisión que apoya: [artículo nuevo / actualización / cubrir un hueco]. Lee primero qué responde hoy a esta consulta antes de proponer el esquema. Genera un brief en Markdown con: 1. La consulta objetivo y la intención que infieres, con la evidencia de esa lectura. 2. Qué cubren las páginas actuales: título, URL y secciones iniciales. 3. Preguntas que responden las páginas actuales y preguntas que se pierden. 4. Un esquema propuesto con una línea por sección indicando qué debe demostrar. 5. Evidencia y ejemplos de las fuentes, con enlaces. 6. Una lista completa de fuentes. Reglas: - No afirmes volumen de búsqueda, dificultad de palabra clave, posición ni tráfico. Este flujo no los mide; escribe «No medido aquí» en lugar de un número. - No inventes estadísticas, citas ni afirmaciones sobre el contenido de competidores. - Describe la intención como una lectura de las páginas, no como un hecho medido. - Mantén las citas breves, atribuidas y enlazadas. - Convierte la región y el idioma en valores explícitos. - Antes de gastar créditos, muestra las llamadas API previstas y espera mi aprobación. - No publiques, programes ni envíes nada. - Escribe el resultado en ./seo-brief.md y resúmelo en el chat.
La copia también incluye los pasos de instalación y las reglas de seguridad.
Lo que obtienes
Salida de ejemplo de una ejecución. No es generación en vivo.
Informe SEO — «cómo automatizar el triaje de soporte»
Consulta objetivo e intención
Consulta: «cómo automatizar el triaje de soporte». Las páginas devueltas empiezan con pasos de implementación, no con páginas de producto, así que la intención se lee como how-to. Es una lectura de las páginas, no una etiqueta de intención medida.
Qué cubren las páginas actuales
| Página | URL | Empieza con |
|---|---|---|
| Automatizar el triaje de soporte: guía práctica | https://example.com/guide | Reglas de enrutado y luego etiquetas |
| Checklist de automatización del triaje | https://example.com/checklist | La propia checklist |
Preguntas que responden
- Qué cambia la automatización del triaje
- Con qué reglas de enrutado empezar
Preguntas que se pierden
- Cómo medir si el triaje mejoró de verdad
- Qué hacer cuando el clasificador se equivoca
Esquema propuesto
- Qué cambia la automatización del triaje — demostrar que va de la cola, no de la plantilla.
- Las tres primeras reglas de enrutado que merece la pena automatizar — demostrar cada una con un ejemplo.
- Cómo medirlo el primer mes — demostrar con una métrica que un responsable de ops pueda sacar.
- Cuando la automatización se equivoca — demostrar la ruta de respaldo humana.
Evidencia
- Ejemplo de regla de enrutado, citado de https://example.com/guide (comprobado el 2026-10-30)
No medido aquí
Volumen de búsqueda, dificultad de palabra clave y posición. Este flujo lee páginas públicas; no consulta un índice de búsqueda ni un rastreador de posiciones.
Fuentes
- https://example.com/guide
- https://example.com/checklist
Las llamadas exactas
Para desarrolladores: el mismo flujo como código, en orden de ejecución.
Mostrar las llamadas reales a la API
Mira quién responde hoy
Pregunta a Chat por la consulta y obtén la respuesta y las páginas citadas. Esas páginas son el contenido competidor actual.
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 }));Salida de ejemplo
{ "answer": "Readers searching this usually want a step-by-step …", "sources": [ { "link": "https://example.com/guide", "title": "…", "snippet": "…" } ] }Lee las páginas en Markdown
Descarga las tres a cinco páginas más sólidas con Web Fetch en Markdown, guardando títulos y preguntas.
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 }; }), );Salida de ejemplo
{ "url": "https://example.com/guide", "checkedAt": "2026-10-30", "content": "# Automating support triage\n\n## Routing rules\n…" }Mapea cobertura y huecos
Extrae H2/H3 y preguntas FAQ de cada página y haz una tabla: qué preguntas se responden y cuáles no.
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]); }Salida de ejemplo
// questions [ { "page": "…", "heading": "What routes should you automate first?" } ]Escribe el brief
Describe consulta, intención, comparación de cobertura, preguntas ausentes, esquema propuesto y fuentes.
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);Salida de ejemplo
# SEO brief — "how to automate support triage"
Guarda en el LiveDoc
Guarda el brief y los enlaces en el LiveDoc para que la próxima actualización solo descargue cambios.
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 archiveSalida de ejemplo
{ "short_id": "PvyKouzJirXjFdst4uKRK3" }
Qué incluye
- Lista de páginas con fuentes de Chat y enlaces de respuesta
- Páginas principales actuales en Markdown
- Títulos y preguntas que cubren
- Brief del que se puede sacar el esquema
- LiveDoc con fuentes para la próxima actualización
Qué no hace
- No mide posiciones, volumen, dificultad ni tráfico
- Solo páginas públicas; login y paywall pueden fallar
- No publica ni reescribe el artículo completo
- Una ejecución por consulta; varias consultas requieren tu bucle
- No garantiza posiciones
Preguntas
¿Mide volumen o posiciones?
No. Lee páginas públicas y evalúa qué contenido responde hoy; posiciones y volumen están en tus herramientas SEO.
¿De dónde vienen los datos?
Chat devuelve páginas con fuentes y Web Fetch las convierte en Markdown. Cada evaluación apunta a una página y fecha concretas.
¿Puedo tratar varias consultas?
Sí, pero una a la vez. Repite los pasos por consulta y guarda briefs separados.
¿Para qué consultas sirve?
Informativas, comparativas y de «cómo hacer», porque las páginas públicas dan señal suficiente. Las transaccionales necesitan tus datos de producto y conversión.
¿Escribe el artículo?
No. Entrega brief y esquema; la escritura es del editor o tu agent de escritura.
¿Cuánto cuesta una ejecución?
Chat y extracción consumen créditos por uso; las tarifas actuales están en la página de precios. El prompt pide aprobación antes de gastar.
Flujos relacionados
Convierte una pregunta en un brief de investigación con fuentes
Pregunta a la web, guarda las páginas detrás de la respuesta como Markdown, añade lo que dicen los profesionales en X y conserva las evidencias en un LiveDoc que puedes consultar después.
Abrir el flujo de trabajoContenidoLlena un mes de contenido con las preguntas de tu audiencia
Mapea temas con Chat, encuentra las preguntas de la audiencia en X, toma un ángulo real de una transcripción de vídeo y compón un calendario de cuatro semanas donde cada fila nombra su evidencia.
Abrir el flujo de trabajoContenidoPublica un resumen diario de IA que tu equipo realmente lea
Obtén un resumen con fuentes, añade lo que publican los profesionales en X, consigue una transcripción de vídeo, compón la edición en Markdown y archívala en un LiveDoc.
Abrir el flujo de trabajoHazlo tuyo
La misma receta, adaptada a cómo entregas de verdad.
Solo consultas comparativas
Limita a «X vs Y» y «mejor X» para ver mejor el ángulo de diferenciación.
Añade tu página de producto
Incluye la página de producto como fuente extra para que el esquema aterrice en tus funciones y precios.
Actualiza cada trimestre
Vuelve a ejecutar en el mismo LiveDoc y observa cómo cambian competidores y esquema.
Seguir
Las páginas de referencia detrás de esta receta y los siguientes pasos.