Felo API PlatformFelo API Platform

Treści

Zamień rozmowy społecznościowe w tygodniowy brief nasłuchu

Znajdź posty X z tego tygodnia o marce i konkurentach, dodaj kontekst web ze źródłami, przeczytaj strony za nim i archiwizuj każde wydanie, żeby kolejny tydzień startował od znanego.

Czas25 minutPoziomŚredniZaktualizowano2026-10-30
Dla kogoMarka i komunikacjaProduct marketingZarządzanie społecznością

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.

Przeprowadź briefing social listening dla [marka, produkt lub kategoria].

Obserwowane terminy: [marka], [nazwa produktu], [nazwy konkurentów], [słowa kluczowe kategorii].
Okres: ostatnie [7 / 14] dni. Strefa czasowa: [strefa]. Odbiorcy: [zespół].
Dozwolone źródła: tylko publiczne posty X i publiczne strony internetowe.

Przygotuj:
1. Pięciolinijkowe podsumowanie tego, co zmieniło się w rozmowie.
2. Tematy, każdy z tym, co mówią ludzie, postami, które to potwierdzają, i zakresem dat.
3. Wzmianki o konkurentach: kogo się poleca i w jakim kontekście.
4. Ryzyka: skargi, awarie, powtarzające się pytania lub negatywne reakcje.
5. Następne kroki podzielone na „odpowiedz teraz”, „obserwuj” i „przekaż produktowi”.
6. Listę źródeł z każdym postem i stroną, URL i datą.

Zasady:
- Raportuj tylko posty i strony zwracane przez API. Nigdy nie wymyślaj ocen sentymentu, liczb zaangażowania, cytatów ani źródeł.
- Traktuj X jako sygnał, nie reprezentatywną ankietę. Mów, gdy próba jest zbyt mała, by wyciągać wnioski.
- Oddzielaj słowa klienta od swojego podsumowania i cytuj krótko z linkiem.
- Zamień okres na konkretne daty rozpoczęcia i zakończenia i podaj strefę czasową.
- Zanim zużyjesz kredyty, pokaż planowane wyszukiwania i ekstrakcje i poczekaj na moją zgodę.
- Nie odpowiadaj, nie publikuj, nie obserwuj i nie pisz do nikogo. Ten briefing jest tylko do czytania.
- Zapisz wynik w ./social-listening.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 briefing (fragment)

Briefing social listening — 2026-10-30

Co się zmieniło

  • Skargi na przepływ eksportu są teraz głównym tematem.
  • W wątkach cenowych polecany jest tańszy rywal.
  • Awaria z 2026-10-27 nie jest już wspominana.

Tematy

  1. Eksport wolny od aktualizacji — @example_dev: „Przycisk eksportu zajmuje teraz minuty dla dokumentu 40 stron.” (2026-10-28); @example_ops: „Ktoś jeszcze widzi eksporty w kolejce pod koniec miesiąca?” (2026-10-29)
  2. Polecana jest tańsza alternatywa — Example Rival pojawia się w wątkach z prośbą o niższą cenę

Konkurenci

Example Rival jest polecany, gdy ktoś prosi o tańszą alternatywę; rekomendacja dotyczy ceny, nie funkcji.

Ryzyka

Skarga na eksport pojawia się w wątkach blisko wsparcia i może trafić do rozmów o odejściu.

Dalej

  • Odpowiedz teraz: wątek eksportu z 2026-10-28.
  • Obserwuj: czy skarga rozprzestrzenia się na odbiorców API.
  • Przekaż produktowi: opóźnienie eksportu pod koniec miesiąca.

Źródła

  • https://x.com/example_dev/status/... — 2026-10-28
  • https://example.com/export-thread — 2026-10-29

Dokładne wywołania

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

Pokaż rzeczywiste wywołania API
  1. Znajdź posty z tygodnia

    Użyj X Search dla marki i konkurentów w ostatnich 7 dniach, zachowując konta i daty.

    listening.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 XData = {
      data: {
        tweets: {
          content: string;
          author: { username: string };
          created_at: string;
          metrics: { retweet_count: number; favorite_count: number; reply_count: number };
          url: string;
        }[];
      };
    };
    
    const since = Math.floor((Date.now() - 7 * 24 * 60 * 60 * 1000) / 1000);
    
    const search = await felo<XData>("/v2/x/tweet/search", {
      query: '"Acme" OR "Acme app"',
      limit: 50,
      since_time: since,
    });
    
    const posts = search.data.tweets;

    Przykładowy wynik

    { "data": { "tweets": [
      {
        "content": "The export flow is slow again.",
        "author": { "username": "example_dev" },
        "created_at": "2026-10-28T09:14:00Z",
        "metrics": { "retweet_count": 4, "favorite_count": 21, "reply_count": 6 },
        "url": "https://x.com/example_dev/status/..."
      }
    ] } }
  2. Dodaj kontekst web ze źródłami

    Zapytaj Chat o kontekst rozmów i weź listę stron ze źródłami.

    listening.ts
    type ChatData = {
      data: {
        answer: string;
        resources: { link: string; title: string; snippet: string }[];
      };
    };
    
    const context = await felo<ChatData>("/v2/chat", {
      query: "Recent customer complaints and competitor mentions around Acme",
    });
    
    const sources = context.data.resources.slice(0, 5);

    Przykładowy wynik

    {
      "answer": "The main threads are …",
      "sources": [
        { "link": "https://example.com/thread", "title": "…", "snippet": "…" }
      ]
    }
  3. Przeczytaj strony za nimi

    Przez Web Fetch przeczytaj dwie lub trzy najtrafniejsze strony i dodaj fakty oraz linki.

    listening.ts
    type ExtractData = { data: { content: string } };
    
    const pages = await Promise.all(
      sources.slice(0, 3).map((source) =>
        felo<ExtractData>("/v2/web/extract", {
          url: source.link,
          output_format: "markdown",
          with_readability: true,
          with_cache: true,
        }).then((page) => ({ ...source, content: page.data.content })),
      ),
    );

    Przykładowy wynik

    // pages[0].content
    "# Example thread summary\n\nExtracted page content…"
  4. Napisz raport według tematów

    Złóż Markdown z tematami, reprezentatywnymi postami, kontekstem, ryzykami i punktami uwagi.

    listening.ts
    const date = new Date().toISOString().slice(0, 10);
    
    const ranked = [...posts].sort(
      (a, b) => b.metrics.favorite_count - a.metrics.favorite_count,
    );
    
    const brief = [
      `# Social listening brief — ${date}`,
      "",
      "## What the web says",
      context.data.answer,
      "",
      "## What people are posting",
      ...ranked.slice(0, 10).map(
        (post) =>
          `- @${post.author.username} (${post.created_at.slice(0, 10)}): ${post.content}\n  ${post.url}`,
      ),
      "",
      "## Pages behind the answer",
      ...pages.map((page) => `- [${page.title}](${page.link})`),
      "",
      "## Sources",
      ...sources.map((source) => `- [${source.title}](${source.link})`),
    ].join("\n");
    
    console.log(brief);
  5. Zarchiwizuj i porównaj z poprzednim tygodniem

    Zapisz raport i źródła w LiveDoc, a w kolejnym tygodniu znajdź poprzednie wydanie.

    listening.ts
    type LiveDocData = { data: { short_id: string } };
    
    const archive = await felo<LiveDocData>("/v2/livedocs", {
      name: "Social listening archive",
      description: "One document resource per weekly brief",
    });
    
    await felo(`/v2/livedocs/${archive.data.short_id}/resources/doc`, {
      title: `Social listening — ${date}`,
      content: brief,
    });
    
    type Retrieved = { data: { title: string; content: string; score: number }[] };
    
    const previous = await felo<Retrieved>(
      `/v2/livedocs/${archive.data.short_id}/resources/retrieve`,
      { query: "what changed since last week" },
    ).then((res) => res.data.filter((hit) => hit.score >= 0.7));

    Przykładowy wynik

    [
      { "title": "Social listening — 2026-10-23", "content": "…", "score": 0.88 }
    ]

Co zawiera

  • Datowane posty X z tygodnia
  • Kontekst web ze źródłami
  • Podsumowanie rozmów według tematów
  • Tygodniowy raport gotowy do udostępnienia
  • LiveDoc z każdym wydaniem

Czego nie robi

  • Zasięg X jest niepełny i nie reprezentuje wszystkich użytkowników
  • Bez ostatecznych wniosków o sentymencie
  • Nie publikuje ani nie odpowiada automatycznie
  • Bez DM i prywatnych społeczności
  • Jedno uruchomienie na tydzień; harmonogram w agencie lub cronie

Pytania

Co liczy się jako źródło?

Każdy post X zachowuje link, konto i datę; kontekst web pochodzi z publicznych stron Chat i Web Fetch. Twierdzenia bez źródła nie wchodzą.

Czy śledzić konkurentów?

Tak. Szukaj marki i konkurentów razem i grupuj w raporcie.

Czy mierzy sentyment?

Podsumowuje tematy i ton, ale oznacza to jako ocenę redakcyjną i nie twierdzi, że podaje dokładny procent sentymentu.

Jak daleko patrzy?

Domyślnie ostatnie 7 dni dla raportu tygodniowego; dla większego okna zmień `since_time`.

Czy można uruchamiać co tydzień?

Tak. Umieść ten sam prompt w cronie lub schedulerze agenta i pisz do tego samego LiveDoc.

Ile kosztuje jeden brief?

X Search, Chat i ekstrakcja stron są rozliczane według użycia; aktualne stawki na stronie cen, a prompt pyta o zgodę przed wydaniem.

Powiązane workflowy

Dostosuj

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

Tylko jeden temat

Ogranicz do jednego launchu lub sporu, by skupić brief.

Dodaj opinie YouTube

Uzupełnij transkryptem wideo, ale oznacz jako doświadczenie osobiste.

Zrób miesięczny

Zmień częstotliwość na miesięczną dla marki i PR.

Strony referencyjne za tą recepturą i kolejne kroki.