Felo API PlatformFelo API Platform

Исследования

Соберите разбор конкурента, которым сразу сможет пользоваться отдел продаж

Соберите страницы самого конкурента, публикации о нём и отзывы покупателей в X, затем сведите разбор, где каждое утверждение имеет источник, дату и статус.

Время30 минутУровеньСреднийОбновлено2026-10-30
Для когоПродуктовый маркетингКонкурентная разведкаПоддержка продаж

Скопировать промпт

Замените поля в квадратных скобках и вставьте в 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 возвращает ответ и использованные страницы — карту того, где обсуждают конкурента. Считайте ответ подсказкой, а не источником: сохраняйте ссылки, они дают строки третьих сторон в таблице доказательств. Helper ниже отправляет ключ один раз и бросает исключение при ответе не 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. Соберите разбор с таблицей доказательств

    Это редакционный шаг: превратите загруженные страницы и посты X в утверждения и дайте каждому источник, дату и статус. Колонка статуса держит документ честным: 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 с источниками, чтобы следующее обновление не начиналось с нуля

Чего не делает

  • Только публичные источники; без интервью о победах и поражениях, заметок CRM и приватных дашбордов
  • Цены только ссылкой и датой, без фиксации тарифов в таблице без даты проверки
  • Покрытие X неполное и не является репрезентативной выборкой покупателей
  • Не выбирает позиционирование за вас; рекомендации помечаются как вывод
  • Не публикует разбор и не пишет в инструменты battlecard

Вопросы

Откуда берутся доказательства?

Chat API возвращает базу с источниками и использованные страницы, Web Fetch превращает страницы конкурента в Markdown, X Search добавляет датированные посты покупателей. Каждая строка сохраняет источник и дату, а вывод имеет отдельный статус.

Можно охватить несколько конкурентов?

Да. Запускайте один и тот же промпт для каждого конкурента и держите отдельный LiveDoc для каждой компании. Сравнительная страница объединяет только строки со статусом «проверено», не смешивая доказательства двух запусков.

Можно цитировать их цены?

Процесс записывает, что написано на странице цен, со ссылкой и датой проверки. Он не фиксирует тарифы в тексте, потому что цены вендоров меняются, а устаревшее число хуже его отсутствия.

Что насчёт наших заметок о победах и поражениях?

Он читает только публичные источники. Добавьте внутренние заметки отдельным документом в LiveDoc и пометьте их как внутренние; они никогда не цитируются в клиентских материалах.

Как часто обновлять?

По триггеру, а не по календарю: изменение цен, запуск продукта или начало цикла продаж. Перезапускайте процесс с тем же LiveDoc, чтобы прошлый разбор остался рядом с новым.

Сколько стоит разбор?

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

Связанные процессы

Адаптируйте под себя

Тот же рецепт, подстроенный под ваш реальный процесс.

Обновляйте по триггеру, а не по календарю

Перезапускайте тот же процесс при изменении цен, крупном релизе или перед большим циклом продаж. Храните каждый разбор как датированный документ в том же LiveDoc, чтобы прошлый квартал оставался рядом с новым.

Превратите разбор в battlecard

Из той же таблицы напишите по странице на роль — экономический покупатель, чемпион, технический ревьюер — используя только строки `Verified` и сохраняя ссылки. Не включайте `Inference` в клиентские материалы.

Сравните двух конкурентов

Запустите процесс для каждого конкурента с отдельным LiveDoc, затем соберите сравнительную страницу только из строк, помеченных `Verified` в обоих запусках. Никогда не объединяйте два запуска в одну таблицу без колонки статуса.

Справочные страницы этого рецепта и куда двигаться дальше.