Felo API PlatformFelo API Platform

Investigación

Crea un análisis de competencia que tu equipo de ventas pueda usar

Reúne las páginas del competidor, la cobertura a su alrededor y lo que dicen los compradores en X, y monta un análisis donde cada afirmación lleva fuente, fecha y estado.

Tiempo30 minutosNivelIntermedioActualizado2026-10-30
Para quiénMarketing de productoInteligencia competitivaEnablement de ventas

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.

Elabora un análisis competitivo de [nombre del competidor] para [nuestro producto].

Alcance: [segmento], [región], [idioma]. Ventana temporal: [últimos 90 días / últimos 12 meses]. Decisión que apoya: [cambio de precio / posicionamiento de lanzamiento / manejo de objeciones].
Fuentes de partida: [dominio del competidor], [URL de precios], [URL del changelog].

Genera un análisis en Markdown con:
1. Cómo se posicionan, en sus propias palabras.
2. Una tabla de evidencia: afirmación, título de la fuente, URL, fecha, estado (Verified / Vendor claim / Third-party / Signal / Inference / Not verified).
3. Precios: lo que dice la página, con el enlace y la fecha de comprobación. Nunca copies una tarifa al texto sin la página y la fecha.
4. Dónde discrepan los compradores, con cuentas de X y fechas, marcado como señal.
5. Qué deberíamos hacer después, marcado como recomendación.
6. Una lista completa de fuentes.

Reglas:
- Cita su posicionamiento; no lo reformules en algo más fuerte.
- Separa afirmaciones del proveedor, cobertura de terceros y tus inferencias. Etiqueta cada fila.
- Nunca inventes precios, métricas, nombres de clientes ni benchmarks. Un dato ausente se escribe «No disponible».
- Convierte la ventana temporal y la región en valores explícitos.
- Antes de gastar créditos, muestra las llamadas API previstas y espera mi aprobación.
- No publiques, envíes, programes ni escribas en ningún CRM.
- Escribe el resultado en ./competitor-teardown.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 análisis (extracto)

Análisis de competencia — [competidor], comprobado el 2026-10-30

Cómo se posicionan

Titular de la home: «La plataforma para equipos de soporte en crecimiento». Página de categoría: «Todo lo que tu equipo de soporte necesita». Ambas son afirmaciones del proveedor, citadas tal cual.

Tabla de evidencia

AfirmaciónFuenteFechaEstado
Se posiciona como plataforma, no como herramienta puntualhttps://example.com/competitor/home2026-10-30Verified
Publica cambios cada semanahttps://example.com/competitor/changelog2026-10-28Verified
Aparece en recopilaciones independienteshttps://example.com/roundup2026-10-27Third-party
Compradores mencionan onboarding lentopublicación de X citada abajo2026-10-14Signal
Empresa es su mayor segmentoNo disponible—Not verified

Precios

La página de precios lista un plan por niveles y otro por uso. No se repiten tarifas aquí; consulta la página viva y la fecha: https://example.com/competitor/pricing (2026-10-30).

Dónde discrepan los compradores

@example_dev, 2026-10-14: «la instalación tardó más de lo que sugería la demo». Una publicación fechada; es una queja, no una estimación de frecuencia.

Recomendación

Destacar el tiempo hasta el primer resultado en la página de comparación. Es nuestra inferencia, no una afirmación del competidor.

Fuentes

  • https://example.com/competitor/home
  • https://example.com/competitor/pricing
  • https://example.com/competitor/changelog

Las llamadas exactas

Para desarrolladores: el mismo flujo como código, en orden de ejecución.

Mostrar las llamadas reales a la API
  1. Empieza con una base con fuentes

    Chat devuelve una respuesta y las páginas usadas, lo que da un mapa de dónde se habla del competidor. Trata la respuesta como pista, no como fuente: conserva los enlaces, que aportan las filas de terceros. El helper envía la clave una vez y lanza error fuera de 2xx.

    competitor.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 competitor = "Example Competitor";
    const segment = "mid-market support teams";
    
    const baseline = await felo<ChatData>("/v2/chat", {
      query: `How does ${competitor} position itself for ${segment}? Include pricing and recent launches.`,
    });
    
    const seedSources = baseline.data.resources.slice(0, 5);

    Salida de ejemplo

    {
      "answer": "The competitor positions itself as …",
      "sources": [
        { "link": "https://example.com/competitor", "title": "…", "snippet": "…" }
      ]
    }
  2. Descarga las páginas que controlan

    La cobertura de terceros dice qué piensa la gente; sus páginas dicen qué afirma. Extrae home, precios y changelog en Markdown con legibilidad y pon fecha de captura: una página de precios sin fecha es una trampa.

    competitor.ts
    type ExtractData = { data: { content: string } };
    
    const ownedPages = [
      { url: "https://example.com/competitor/home", title: "Homepage" },
      { url: "https://example.com/competitor/pricing", title: "Pricing" },
      { url: "https://example.com/competitor/changelog", title: "Changelog" },
    ];
    
    const fetched = await Promise.all(
      ownedPages.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/competitor/pricing",
      "checkedAt": "2026-10-30",
      "content": "# Pricing\n\nExtracted page text…"
    }
  3. Mira qué dicen los compradores en X

    Busca en X objeciones y rodeos sobre el competidor. Guarda cuenta y fecha de cada post; una cita fechada prueba una queja, no su frecuencia. El análisis la marca como señal y nunca convierte unosposts en porcentaje.

    competitor.ts
    type XData = {
      data: {
        tweets: {
          content: string;
          author: { username: string };
          created_at: string;
          metrics: { retweet_count: number; favorite_count: number };
        }[];
      };
    };
    
    const since = Math.floor((Date.now() - 90 * 24 * 60 * 60 * 1000) / 1000);
    
    const buyerSignal = await felo<XData>("/v2/x/tweet/search", {
      query: `"${competitor}" (pricing OR onboarding OR migration)`,
      limit: 25,
      since_time: since,
    });
    
    const objections = buyerSignal.data.tweets.slice(0, 5);

    Salida de ejemplo

    { "data": { "tweets": [
      {
        "content": "setup took longer than the demo suggested",
        "author": { "username": "example_dev" },
        "created_at": "2026-10-14T09:20:00Z",
        "metrics": { "retweet_count": 3, "favorite_count": 24 }
      }
    ] } }
  4. Monta el análisis con tabla de evidencias

    Este es el paso editorial: convierte páginas y posts en afirmaciones y da a cada una fuente, fecha y estado. La columna de estado mantiene el documento honesto: Verified para lo que dice la página, Vendor claim para marketing, Third-party para cobertura externa, Signal para un post fechado, Inference para tu lectura y Not verified sin evidencia.

    competitor.ts
    const today = new Date().toISOString().slice(0, 10);
    
    const row = (claim: string, source: string, date: string, status: string) =>
      `| ${claim} | ${source} | ${date} | ${status} |`;
    
    const teardown = [
      `# Competitor teardown — ${competitor}`,
      `Scope: ${segment}. Checked ${today}.`,
      "",
      "| Claim | Source | Date | Status |",
      "| --- | --- | --- | --- |",
      row("Free tier listed on the pricing page", ownedPages[1].url, fetched[1].checkedAt, "Verified"),
      row("Positions as a platform, not a point tool", ownedPages[0].url, fetched[0].checkedAt, "Vendor claim"),
      row("Discussed in independent coverage", seedSources[0]?.link ?? "Not available", today, "Third-party"),
      row("Buyers report onboarding friction", "X post, quoted below", today, "Signal"),
      row("Most revenue comes from enterprise", "Not available", "—", "Not verified"),
      "",
      "## Recommendation",
      "Lead with time-to-first-result on the comparison page. Inference, not a competitor claim.",
    ].join("\n");
    
    console.log(teardown);

    Salida de ejemplo

    | Free tier listed on the pricing page | https://example.com/competitor/pricing | 2026-10-30 | Verified |
  5. Archiva en el LiveDoc para la próxima actualización

    Crea un LiveDoc por competidor, añade las páginas capturadas como recursos URL y el análisis como documento. Volver a añadir URLs se deduplica, así el próximo trimestre solo descargas cambios y el análisis anterior sigue en el mismo archivo.

    competitor.ts
    type LiveDocData = { data: { short_id: string } };
    
    const teardownDoc = await felo<LiveDocData>("/v2/livedocs", {
      name: `Teardown: ${competitor}`,
      description: `Sources and teardown checked ${today}`,
    });
    
    await felo(`/v2/livedocs/${teardownDoc.data.short_id}/resources/urls`, {
      urls: fetched.map((page) => ({ url: page.url, title: page.title })),
    });
    
    await felo(`/v2/livedocs/${teardownDoc.data.short_id}/resources/doc`, {
      title: `Teardown ${today}`,
      content: teardown,
    });
    
    console.log(teardownDoc.data.short_id); // the next refresh reuses this LiveDoc

    Salida de ejemplo

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

Qué incluye

  • Base con fuentes del Chat API y las páginas detrás
  • Home, precios y changelog del competidor extraídos en Markdown
  • Comentarios fechados de compradores en X, marcados como señal y no prueba
  • Tabla de evidencias que separa hechos verificados, afirmaciones del proveedor e inferencia
  • LiveDoc que guarda las fuentes para no empezar de cero

Qué no hace

  • Solo fuentes públicas; sin entrevistas ganada/perdida, notas de CRM ni paneles privados
  • Los precios se enlazan y fechan, nunca se congelan en una tabla sin fecha de comprobación
  • La cobertura de X es incompleta y no es una muestra representativa de compradores
  • No elige tu posicionamiento; las recomendaciones se marcan como inferencia
  • No publica el análisis ni escribe en herramientas de battlecard

Preguntas

¿De dónde vienen las evidencias?

El Chat API devuelve una base con fuentes y las páginas usadas, Web Fetch convierte las páginas del competidor en Markdown y X Search añade posts fechados. Cada fila conserva fuente y fecha, y las inferencias tienen su propio estado.

¿Puedo cubrir varios competidores?

Sí. Ejecuta el mismo prompt una vez por competidor y mantén un LiveDoc por empresa. Una página comparativa solo une filas marcadas como verificadas, sin mezclar evidencias de dos ejecuciones.

¿Puedo citar sus precios?

El flujo registra lo que dice la página de precios, con enlace y fecha de comprobación. No congela tarifas en el texto, porque cambian y un número desactualizado es peor que ninguno.

¿Y nuestras notas de ganada/perdida?

Solo lee fuentes públicas. Añade notas internas como recurso de documento aparte en el LiveDoc y márcalas como internas; nunca se citan en material para clientes.

¿Cada cuánto actualizarlo?

Por disparador, no por calendario: cambio de precio, lanzamiento o inicio de ciclo de ventas. Vuelve a ejecutar en el mismo LiveDoc para que el trimestre anterior quede junto al nuevo.

¿Cuánto cuesta un análisis?

Cada llamada de chat, extracción y búsqueda en X consume 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.

Actualiza por disparador, no por calendario

Vuelve a ejecutar cuando el competidor cambie precios, lance algo grande o antes de un ciclo de ventas. Guarda cada análisis como documento fechado en el mismo LiveDoc para comparar trimestres.

Convierte el análisis en battlecards

Con la misma tabla, escribe una página por rol —comprador económico, campeón y revisor técnico— usando solo filas `Verified` y con los enlaces. Deja `Inference` fuera de material para clientes.

Compara dos competidores

Ejecuta el flujo una vez por competidor con LiveDocs separados y crea una página comparativa solo con filas `Verified` en ambas ejecuciones. Nunca mezcles dos ejecuciones sin columna de estado.

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