Felo API PlatformFelo API Platform

Badania

Zbuduj analizę konkurencji, której użyje zespół sprzedaży

Zbierz strony konkurenta, otaczające go relacje i to, co kupujący mówią na X, a potem złóż analizę, w której każde twierdzenie ma źródło, datę i status.

Czas30 minutPoziomŚredniZaktualizowano2026-10-30
Dla kogoProduct marketingCompetitive intelligenceSales enablement

Skopiuj prompt

Podmień pola w nawiasach kwadratowych i wklej do Claude Code, Codex albo AI z dostępem do terminala. Instaluje skill Felo, pyta przed wydaniem kredytów i uruchamia workflow.

Przygotuj analizę konkurencji [nazwa konkurenta] dla [nasz produkt].

Zakres: [segment], [region], [język]. Okres: [ostatnie 90 dni / ostatnie 12 miesięcy]. Decyzja, którą wspiera: [zmiana cen / pozycjonowanie premiery / obsługa obiekcji].
Źródła na start: [domena konkurenta], [URL strony z cenami], [URL changelog].

Przygotuj analizę w Markdown zawierającą:
1. Jak się pozycjonują, ich własnymi słowami.
2. Tabelę dowodów: twierdzenie, tytuł źródła, URL, data, status (Verified / Vendor claim / Third-party / Signal / Inference / Not verified).
3. Ceny: co mówi strona, z linkiem i datą sprawdzenia. Nigdy nie przenoś stawki do tekstu bez strony i daty.
4. Miejsca, w których kupujący się sprzeciwiają, z kontami X i datami, oznaczone jako sygnał.
5. Co powinniśmy zrobić dalej, oznaczone jako rekomendacja.
6. Pełną listę źródeł.

Zasady:
- Cytuj ich pozycjonowanie; nie przeformułowuj go na mocniejsze twierdzenie.
- Oddziel twierdzenia dostawcy, relacje zewnętrzne i własne wnioski. Oznacz każdy wiersz.
- Nigdy nie wymyślaj ceny, metryki, nazwy klienta ani benchmarku. Brak danych to „Brak danych”.
- Zamień okres i region na konkretne wartości.
- Zanim zużyjesz kredyty, pokaż planowane wywołania API i poczekaj na moją zgodę.
- Nie publikuj, nie wysyłaj, nie planuj i nie zapisuj niczego w CRM.
- Zapisz wynik w ./competitor-teardown.md i podsumuj go w czacie.

Kopia zawiera też kroki instalacji i zasady bezpieczeństwa.

Co otrzymujesz

Przykładowy wynik jednego uruchomienia. Nie generowanie na żywo.

Przykładowy teardown (fragment)

Teardown konkurencji — [konkurent], sprawdzono 2026-10-30

Jak się pozycjonują

Nagłówek strony: „Platforma dla rosnących zespołów wsparcia.” Strona kategorii: „Wszystko, czego potrzebuje Twój zespół wsparcia.” Oba to twierdzenia dostawcy, cytowane dosłownie.

Tabela dowodów

TwierdzenieŹródłoDataStatus
Pozycjonuje się jako platforma, nie punktowe narzędziehttps://example.com/competitor/home2026-10-30Verified
Wydaje zmiany co tydzieńhttps://example.com/competitor/changelog2026-10-28Verified
Wymieniony w niezależnych zestawieniachhttps://example.com/roundup2026-10-27Third-party
Kupujący wspominają wolny onboardingpost X cytowany niżej2026-10-14Signal
Enterprise to ich największy segmentBrak danych—Not verified

Ceny

Strona cen wymienia plan progowy i plan zużyciowy. Stawki nie są tu powtarzane; sprawdź stronę na żywo i datę: https://example.com/competitor/pricing (2026-10-30).

Gdzie kupujący się sprzeciwiają

@example_dev, 2026-10-14: „instalacja zajęła więcej czasu, niż sugerowało demo.” Jeden datowany post; to skarga, nie szacunek częstości.

Rekomendacja

Na stronie porównania wysuń czas do pierwszego wyniku. To nasza dedukcja, nie twierdzenie konkurenta.

Źródła

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

Dokładne wywołania

Dla deweloperów: ten sam workflow jako kod, w kolejności wykonania.

Pokaż rzeczywiste wywołania API
  1. Zacznij od podstawy ze źródłami

    Chat zwraca odpowiedź i użyte strony, czyli mapę, gdzie mówi się o konkurencie. Traktuj odpowiedź jako wskazówkę, nie źródło: zachowaj linki, bo dają wiersze od stron trzecich. Helper wysyła klucz raz i rzuca błąd poza 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);

    Przykładowy wynik

    {
      "answer": "The competitor positions itself as …",
      "sources": [
        { "link": "https://example.com/competitor", "title": "…", "snippet": "…" }
      ]
    }
  2. Pobierz strony, które kontrolują

    Relacje stron trzecich pokazują, co ludzie myślą; ich strony pokazują, co twierdzą. Wyekstrahuj stronę główną, cennik i changelog jako Markdown z trybem czytania i zapisz datę pobrania: cennik bez daty to pułapka.

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

    Przykładowy wynik

    {
      "url": "https://example.com/competitor/pricing",
      "checkedAt": "2026-10-30",
      "content": "# Pricing\n\nExtracted page text…"
    }
  3. Zobacz, co kupujący mówią na X

    Szukaj na X obiekcji i obejść dotyczących konkurenta. Zachowaj konto i datę każdego posta; datowany cytat dowodzi skargi, nie jej częstotliwości. Analiza oznacza to jako sygnał i nigdy nie zamienia kilku postów w procent.

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

    Przykładowy wynik

    { "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. Złóż analizę z tabelą dowodów

    To krok redakcyjny: zamień strony i posty w twierdzenia i daj każdemu źródło, datę i status. Kolumna statusu trzyma dokument uczciwym: Verified dla tego, co mówi strona, Vendor claim dla marketingu, Third-party dla relacji zewnętrznych, Signal dla datowanego posta, Inference dla twojej lektury i Not verified bez dowodów.

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

    Przykładowy wynik

    | Free tier listed on the pricing page | https://example.com/competitor/pricing | 2026-10-30 | Verified |
  5. Zarchiwizuj w LiveDoc na kolejną aktualizację

    Utwórz jeden LiveDoc na konkurenta, dodaj pobrane strony jako zasoby URL i analizę jako dokument. Ponowne dodanie URL jest deduplikowane, więc w kolejnym kwartale pobierasz tylko zmiany, a poprzednia analiza zostaje w tym samym archiwum.

    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

    Przykładowy wynik

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

Co zawiera

  • Podstawa ze źródłami z Chat API i strony za nią
  • Strona główna, cennik i changelog konkurenta jako Markdown
  • Datowane komentarze kupujących z X, oznaczone jako sygnał, nie dowód
  • Tabela dowodów oddzielająca zweryfikowane fakty, twierdzenia dostawcy i inferencję
  • LiveDoc trzymający źródła, żeby nie zaczynać od zera

Czego nie robi

  • Tylko źródła publiczne; bez wywiadów win/loss, notatek CRM i prywatnych dashboardów
  • Ceny są linkowane i datowane, nigdy nie zamrażane w tabeli bez daty weryfikacji
  • Zasięg X jest niepełny i nie stanowi reprezentatywnej próby kupujących
  • Nie wybiera twojego pozycjonowania; rekomendacje są oznaczone jako inferencja
  • Nie publikuje analizy ani nie zapisuje do narzędzi battlecard

Pytania

Skąd pochodzą dowody?

Chat API zwraca podstawę ze źródłami i użyte strony, Web Fetch zamienia strony konkurenta w Markdown, a X Search dodaje datowane posty. Każdy wiersz ma źródło i datę, inferencja ma własny status.

Czy można objąć kilku konkurentów?

Tak. Uruchom ten sam prompt dla każdego konkurenta i trzymaj jeden LiveDoc na firmę. Strona porównawcza łączy tylko wiersze „zweryfikowane”, bez mieszania dowodów z dwóch uruchomień.

Czy można cytować ich ceny?

Workflow zapisuje, co mówi strona cennika, z linkiem i datą weryfikacji. Nie zamraża stawek w tekście, bo ceny się zmieniają, a nieaktualna liczba jest gorsza od braku liczby.

A nasze notatki win/loss?

Czyta tylko źródła publiczne. Dodaj notatki wewnętrzne jako osobny dokument w LiveDoc i oznacz jako wewnętrzne; nigdy nie są cytowane w materiałach dla klientów.

Jak często odświeżać?

Wyzwalaczem, nie kalendarzem: zmiana ceny, launch albo start cyklu sprzedaży. Uruchom ponownie w tym samym LiveDoc, żeby poprzedni kwartał stał obok nowego.

Ile kosztuje jedna analiza?

Każde wywołanie czatu, ekstrakcji i wyszukiwania X zużywa kredyty według użycia; aktualne stawki na stronie cen. Prompt pyta o zgodę przed wydaniem.

Powiązane workflowy

Dostosuj

Ta sama receptura, dopasowana do tego, jak naprawdę dostarczasz.

Odświeżaj wyzwalaczem, nie kalendarzem

Uruchom ponownie, gdy konkurent zmieni ceny, zrobi duży launch albo przed cyklem sprzedaży. Trzymaj każdą analizę jako datowany dokument w tym samym LiveDoc.

Zamień analizę w battlecardy

Z tej samej tabeli napisz stronę na rolę — kupujący ekonomiczny, champion, recenzent techniczny — używając tylko wierszy `Verified` z linkami. Zostaw `Inference` poza materiałami dla klientów.

Porównaj dwóch konkurentów

Uruchom workflow dla każdego konkurenta z osobnymi LiveDocs i zbuduj stronę porównawczą tylko z wierszy `Verified` w obu uruchomieniach. Nigdy nie łącz dwóch uruchomień bez kolumny statusu.

Strony referencyjne za tą recepturą i kolejne kroki.