Felo API PlatformFelo API Platform

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.

Tiempo25 minutosNivelIntermedioActualizado2026-10-30
Para quiénMarketing de contenidoEspecialistas SEOEditores

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.

Ejemplo de informe (extracto)

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áginaURLEmpieza con
Automatizar el triaje de soporte: guía prácticahttps://example.com/guideReglas de enrutado y luego etiquetas
Checklist de automatización del triajehttps://example.com/checklistLa 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

  1. Qué cambia la automatización del triaje — demostrar que va de la cola, no de la plantilla.
  2. Las tres primeras reglas de enrutado que merece la pena automatizar — demostrar cada una con un ejemplo.
  3. Cómo medirlo el primer mes — demostrar con una métrica que un responsable de ops pueda sacar.
  4. 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
  1. 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": "…" }
      ]
    }
  2. 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…"
    }
  3. 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?" }
    ]
  4. 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"
  5. 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 archive

    Salida 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

Hazlo 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.

Las páginas de referencia detrás de esta receta y los siguientes pasos.