Felo API PlatformFelo API Platform

Дослідження

Побудуйте аналіз конкурентів, який використає відділ продажів

Зберіть сторінки конкурента, висвітлення навколо нього й те, що покупці кажуть на X, а потім складіть аналіз, де кожне твердження має джерело, дату й статус.

Час30 хвилинРівеньСереднійОновлено2026-10-30
Для когоProduct marketingCompetitive intelligenceSales enablement

Скопіювати промпт

Замініть поля в квадратних дужках і вставте в Claude Code, Codex або AI з доступом до термінала. Він встановить скіл Felo, запитає перед витратою кредитів і запустить процес.

Склади конкурентний розбір [назва конкурента] для [наш продукт].

Обсяг: [сегмент], [регіон], [мова]. Період: [останні 90 днів / останні 12 місяців]. Рішення, яке він підтримує: [зміна цін / позиціонування запуску / робота із запереченнями].
Початкові джерела: [домен конкурента], [URL сторінки цін], [URL changelog].

Створи Markdown-розбір із:
1. Тим, як вони позиціонують себе, їхніми словами.
2. Таблицею доказів: твердження, назва джерела, URL, дата, статус (Verified / Vendor claim / Third-party / Signal / Inference / Not verified).
3. Цінами: що написано на сторінці, з посиланням і датою перевірки. Ніколи не переноси тариф у текст без сторінки й дати.
4. Місцями, де покупці заперечують, з акаунтами X і датами, позначеними як сигнал.
5. Тим, що нам робити далі, позначеним як рекомендація.
6. Повним списком джерел.

Правила:
- Цитуй їхнє позиціонування; не переформульовуй його в сильніше твердження.
- Відокремлюй заяви постачальника, висвітлення третіх сторін і власні висновки. Позначай кожен рядок.
- Ніколи не вигадуй ціну, метрику, ім'я клієнта чи бенчмарк. Відсутні дані — «Даних немає».
- Перетвори період і регіон на явні значення.
- Перед витратою кредитів покажи заплановані виклики API і дочекайся мого схвалення.
- Нічого не публікуй, не надсилай, не плануй і не записуй у CRM.
- Запиши результат у ./competitor-teardown.md і підсумуй його в чаті.

Копія також містить кроки встановлення й правила безпеки.

Що ви отримаєте

Приклад результату одного запуску. Не живе генерування.

Приклад розбору (фрагмент)

Конкурентний розбір — [конкурент], перевірено 2026-10-30

Як вони позиціонуються

Заголовок головної: «Платформа для зростаючих команд підтримки». Сторінка категорії: «Усе, що потрібно вашій команді підтримки». Обидва — заяви постачальника, цитовані дослівно.

Таблиця доказів

ТвердженняДжерелоДатаСтатус
Позиціонується як платформа, а не точковий інструментhttps://example.com/competitor/home2026-10-30Verified
Випускає зміни щотижняhttps://example.com/competitor/changelog2026-10-28Verified
Згаданий у незалежних оглядахhttps://example.com/roundup2026-10-27Third-party
Покупці згадують повільний онбордингдопис X нижче2026-10-14Signal
Enterprise — їхній найбільший сегментДаних немає—Not verified

Ціни

На сторінці цін є ступінчастий план і план за використанням. Тарифи тут не повторюються; перевірте живу сторінку й дату: https://example.com/competitor/pricing (2026-10-30).

Де покупці заперечують

@example_dev, 2026-10-14: «встановлення зайняло більше часу, ніж обіцяла демонстрація». Один датований допис; це скарга, а не оцінка частоти.

Рекомендація

На сторінці порівняння винести час до першого результату. Це наш висновок, а не заява конкурента.

Джерела

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

Точні виклики

Для розробників: той самий процес як код, у порядку виконання.

Показати справжні виклики API
  1. Почніть з основи з джерелами

    Chat повертає відповідь і використані сторінки — карту, де говорять про конкурента. Ставтеся до відповіді як до підказки, не джерела: збережіть посилання, вони дають рядки третіх сторін. Хелпер надсилає ключ один раз і кидає помилку поза 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);

    Приклад результату

    {
      "answer": "The competitor positions itself as …",
      "sources": [
        { "link": "https://example.com/competitor", "title": "…", "snippet": "…" }
      ]
    }
  2. Завантажте сторінки, які контролюють вони

    Висвітлення третіх сторін показує, що люди думають; їхні сторінки показують, що вони стверджують. Вилучіть головну, ціни й changelog як Markdown із режимом читання й запишіть дату завантаження: сторінка цін без дати — пастка.

    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 };
      }),
    );

    Приклад результату

    {
      "url": "https://example.com/competitor/pricing",
      "checkedAt": "2026-10-30",
      "content": "# Pricing\n\nExtracted page text…"
    }
  3. Подивіться, що покупці кажуть на X

    Шукайте на X заперечення й обходи щодо конкурента. Зберігайте акаунт і дату кожного поста; датована цитата доводить скаргу, не її частоту. Аналіз позначає це як сигнал і ніколи не перетворює кілька постів на відсоток.

    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);

    Приклад результату

    { "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. Складіть аналіз із таблицею доказів

    Це редакційний крок: перетворіть сторінки й пости на твердження й дайте кожному джерело, дату й статус. Стовпець статусу тримає документ чесним: Verified для того, що каже сторінка, Vendor claim для маркетингу, Third-party для зовнішнього висвітлення, Signal для датованого поста, Inference для вашого прочитання й Not verified без доказів.

    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);

    Приклад результату

    | Free tier listed on the pricing page | https://example.com/competitor/pricing | 2026-10-30 | Verified |
  5. Заархівуйте в LiveDoc для наступного оновлення

    Створіть один LiveDoc на конкурента, додайте завантажені сторінки як URL-ресурси й аналіз як документ. Повторне додавання URL дедуплікується, тож наступного кварталу ви завантажуєте лише зміни, а попередній аналіз лишається в тому самому архіві.

    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

    Приклад результату

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

Що входить

  • Основа з джерелами з Chat API і сторінки за нею
  • Головна, ціни й changelog конкурента як Markdown
  • Датовані коментарі покупців із X, позначені як сигнал, а не доказ
  • Таблиця доказів, що відділяє перевірені факти, заяви постачальника й висновки
  • LiveDoc, що зберігає джерела, щоб не починати з нуля

Чого не робить

  • Лише публічні джерела; без інтерв’ю win/loss, нотаток CRM і приватних дашбордів
  • Ціни посилаються й датуються, ніколи не заморожуються в таблиці без дати перевірки
  • Покриття X неповне й не є репрезентативною вибіркою покупців
  • Не обирає ваше позиціонування; рекомендації позначені як висновки
  • Не публікує аналіз і не записує в інструменти battlecard

Запитання

Звідки докази?

Chat API повертає основу з джерелами й використані сторінки, Web Fetch перетворює сторінки конкурента на Markdown, а X Search додає датовані пости. Кожен рядок має джерело й дату, висновки мають власний статус.

Чи можна охопити кількох конкурентів?

Так. Запустіть той самий промпт для кожного конкурента й тримайте один LiveDoc на компанію. Порівняльна сторінка поєднує лише рядки «перевірено», без змішування доказів двох запусків.

Чи можна цитувати їхні ціни?

Процес записує, що каже сторінка цін, із посиланням і датою перевірки. Не заморожує тарифи в тексті, бо ціни змінюються, а застаріле число гірше за жодне.

А наші нотатки win/loss?

Він читає лише публічні джерела. Додайте внутрішні нотатки як окремий документ у LiveDoc і позначте внутрішніми; вони ніколи не цитуються в матеріалах для клієнтів.

Як часто оновлювати?

За тригером, не за календарем: зміна ціни, запуск або початок циклу продажів. Запустіть знову в тому самому LiveDoc, щоб попередній квартал стояв поруч із новим.

Скільки коштує один аналіз?

Кожен виклик чату, вилучення й пошуку X витрачає кредити за використання; актуальні тарифи на сторінці цін. Промпт просить схвалення перед витратою.

Пов’язані процеси

Адаптуйте

Той самий рецепт, підлаштований під те, як ви насправді працюєте.

Оновлюйте за тригером, не за календарем

Запустіть знову, коли конкурент змінює ціни, робить великий запуск або перед циклом продажів. Тримайте кожен аналіз як датований документ у тому самому LiveDoc.

Перетворіть аналіз на battlecard

З тієї самої таблиці напишіть сторінку на роль — економічний покупець, чемпіон, технічний рецензент — лише з рядками `Verified` і посиланнями. Залиште `Inference` поза матеріалами для клієнтів.

Порівняйте двох конкурентів

Запустіть процес для кожного конкурента з окремими LiveDocs і побудуйте порівняльну сторінку лише з рядків `Verified` в обох запусках. Ніколи не поєднуйте два запуски без стовпця статусу.

Довідкові сторінки за цим рецептом і наступні кроки.