Felo API PlatformFelo API Platform

Content

Maak van socialgesprekken een wekelijkse luisterbrief

Zoek de X-posts van de afgelopen week over je merk en concurrenten, voeg onderbouwde webcontext toe, lees de pagina’s erachter en archiveer elke editie zodat de volgende week bij het bekende begint.

Tijd25 minutenNiveauGevorderdBijgewerkt2026-10-30
Voor wieMerk & communicatieProductmarketingCommunitybeheer

Prompt kopiëren

Vervang de velden tussen blokhaken en plak in Claude Code, Codex of een AI met terminaltoegang. Die installeert de Felo-skill, vraagt voor credits en voert de workflow uit.

Voer een social-listeningbrief uit voor [merk, product of categorie].

Volgtermen: [merk], [productnaam], [concurrentnamen], [categorie-zoekwoorden].
Tijdvenster: laatste [7 / 14] dagen. Tijdzone: [tijdzone]. Publiek: [team].
Toegestane bronnen: alleen publieke X-posts en publieke webpagina’s.

Lever:
1. Een samenvatting van vijf regels over wat er in het gesprek veranderde.
2. Thema’s, elk met wat mensen zeggen, de posts die het ondersteunen en de periode die ze dekken.
3. Vermeldingen van concurrenten: wie wordt aanbevolen, en in welke context.
4. Risico’s: klachten, storingen, terugkerende vragen of weerstand.
5. Vervolgstappen, verdeeld in ‘nu antwoorden’, ‘volgen’ en ‘naar product’.
6. Een bronnenlijst met elke post en pagina, URL en datum.

Regels:
- Rapporteer alleen posts en pagina’s die de API teruggeeft. Verzin nooit sentiment scores, engagementcijfers, citaten of bronnen.
- Behandel X als signaal, niet als representatief onderzoek. Zeg het wanneer de steekproef te klein is om conclusies te trekken.
- Scheid de woorden van de klant van jouw samenvatting en citeer kort met link.
- Zet het tijdvenster om in expliciete begin- en einddatums en noem de tijdzone.
- Voordat er credits worden gebruikt, toon je de geplande zoekopdrachten en extracties en wacht je op mijn goedkeuring.
- Antwoord niet, post niet, volg niet en stuur niemand een bericht. Deze brief is alleen-lezen.
- Schrijf het resultaat naar ./social-listening.md en vat het samen in de chat.

De kopie bevat ook de installatiestappen en veiligheidsregels.

Wat je krijgt

Voorbeelduitvoer van een run. Geen live generatie.

Voorbeeldbrief (fragment)

Social-listeningbrief — 2026-10-30

Wat veranderde

  • Klachten over de exportflow zijn nu het hoofdthema.
  • Een goedkopere rivaal wordt aanbevolen in prijsthreads.
  • De storing van 2026-10-27 wordt niet meer genoemd.

Thema’s

  1. Export is traag sinds de update — @example_dev: “De exportknop kost nu minuten voor een document van 40 pagina’s.” (2026-10-28); @example_ops: “Ziet iemand anders export in de wachtrij aan het eind van de maand?” (2026-10-29)
  2. Een goedkoper alternatief wordt aanbevolen — Example Rival verschijnt in threads waar om een lagere prijs wordt gevraagd

Concurrenten

Example Rival wordt aanbevolen als om een goedkoper alternatief wordt gevraagd; de aanbeveling gaat over prijs, niet functies.

Risico’s

De exportklacht verschijnt in supportnabije threads en kan verloopgesprekken bereiken.

Volgende

  • Nu antwoorden: de exportthread van 2026-10-28.
  • Volgen: of de klacht zich verspreidt naar het API-publiek.
  • Naar product: exportlatency aan het eind van de maand.

Bronnen

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

De exacte aanroepen

Voor ontwikkelaars: dezelfde workflow als kopieerbare code in uitvoeringsvolgorde.

Exacte API-aanroepen tonen
  1. Zoek de posts van de week

    Gebruik X Search voor merk en concurrenten in de laatste 7 dagen en bewaar accounts en datums.

    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;

    Voorbeelduitvoer

    { "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. Voeg onderbouwde webcontext toe

    Vraag Chat naar de context van de discussies en haal een onderbouwde paginalijst op.

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

    Voorbeelduitvoer

    {
      "answer": "The main threads are …",
      "sources": [
        { "link": "https://example.com/thread", "title": "…", "snippet": "…" }
      ]
    }
  3. Lees de pagina’s erachter

    Lees met Web Fetch de twee of drie relevantste pagina’s en voeg feiten en links toe.

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

    Voorbeelduitvoer

    // pages[0].content
    "# Example thread summary\n\nExtracted page content…"
  4. Schrijf het weekrapport per thema

    Stel Markdown samen met thema’s, representatieve posts, context, risico’s en aandachtspunten.

    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. Archiveer en vergelijk met vorige week

    Bewaar rapport en bronnen in de LiveDoc en zoek volgende week de vorige editie op.

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

    Voorbeelduitvoer

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

Wat inbegrepen is

  • Gedateerde X-posts van de week
  • Onderbouwde webcontext
  • Samenvatting van discussies per thema
  • Direct deelbaar weekrapport
  • LiveDoc met elke editie

Wat het niet doet

  • X-dekking is onvolledig en vertegenwoordigt niet alle gebruikers
  • Geen definitieve sentimentconclusies
  • Plaatst of antwoordt niet automatisch
  • Geen DM’s of privécommunities
  • Eén run per week; planning hoort bij je agent of cron

Vragen

Wat telt als bron?

Elke X-post behoudt link, account en datum; webcontext komt uit openbare Chat- en Web Fetch-pagina’s. Beweringen zonder bron komen niet binnen.

Kan ik concurrenten volgen?

Ja. Zoek merk en concurrenten samen en groepeer in het rapport.

Meet het sentiment?

Het vat thema’s en toon samen, maar markeert dat als redactionele beoordeling en claimt geen exact sentimentpercentage.

Hoe ver kijkt het terug?

Standaard de laatste 7 dagen voor het weekrapport; voor een groter venster wijzig je `since_time`.

Kan het wekelijks draaien?

Ja. Zet dezelfde prompt in cron of een agentscheduler en schrijf in dezelfde LiveDoc.

Wat kost een brief?

X Search, Chat en pagina-extractie worden op gebruik gefactureerd; actuele tarieven staan op de prijspagina en de prompt vraagt goedkeuring voor uitgaven.

Gerelateerde workflows

Maak het van jou

Hetzelfde recept, aangepast aan hoe je echt oplevert.

Alleen één onderwerp

Beperk tot één launch of discussie om de brief te focussen.

Voeg YouTube-meningen toe

Vul aan met een videotranscript, maar markeer als persoonlijke ervaring.

Maak er een maandrapport van

Zet de frequentie op maandelijks voor merk en PR.

De referentiepagina’s achter dit recept en de volgende stappen.