Felo API PlatformFelo API Platform

Research

Onderzoek een productniche voordat je voorraad inkoopt

Verzamel de categoriecontext, leg concurrentpagina’s vast op een genoemde datum, lees op X waar kopers over klagen en houd bewijs en memo in één LiveDoc die je voor de bestelling opnieuw bekijkt.

Tijd30 minutenNiveauGevorderdBijgewerkt2026-10-30
Voor wieE-commerce operatorsProductonderzoekersDTC-oprichters

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.

Onderzoek deze productniche voordat we voorraad inkopen of lanceren: [product of categorie].

Markt: [land of regio]. Kanaal: [marktplaats / DTC / retail]. Tijdvenster voor kopersposts: laatste [30] dagen.
Vergelijkbare producten of concurrent-URL’s: [URL’s]. Budget- en margebeperkingen: [beperkingen]. Publiek: [team].

Lever een Markdown-memo met:
1. Een oordeel van één alinea: is dit verder onderzoeken waard, en wat zou je mening veranderen.
2. Vraagsignalen: wat bronnen zeggen over interesse, seizoen en substituten.
3. Concurrerende producten: wat elk beweert, de prijs die op de pagina is vastgelegd en waar kopers vinden dat het tekortschiet.
4. Prijspositionering: de prijzen die daadwerkelijk op de pagina’s zijn gevonden, elk met vastlegdatum.
5. Klachten en onvervulde behoeften, met citaten, accounts en datums.
6. Risico’s en open vragen die vóór de inkoop moeten worden opgelost.
7. Bronnen: elke gebruikte pagina en post, met URL en datum.

Regels:
- Gebruik alleen wat de API’s teruggeven. Verzin nooit marktomvang, verkoopramingen, reviewaantallen of concurrentprijzen.
- Rapporteer prijzen precies zoals vastgelegd, met pagina-URL en vastlegdatum. Middel of normaliseer ze nooit.
- Behandel X-posts als anekdotes, niet als marktdata, en zeg het wanneer de steekproef dun is.
- Scheid wat een leverancier beweert van wat een koper meldt.
- Voordat er credits worden gebruikt, toon je de geplande extracties en zoekopdrachten en wacht je op mijn goedkeuring.
- Neem geen contact op met leveranciers, plaats geen orders en stuur niemand een bericht op X.
- Schrijf het resultaat naar ./product-research.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.

Voorbeeldmemo (fragment)

Productonderzoek — voorbeeldcategorie

Oordeel

Nader bekijken waard, maar het publieke bewijs volstaat niet voor een voorraadbeslissing. De open vragen hieronder zijn de volgende stap.

Categoriecontext

Kopers vergelijken op werkbladruimte en schoonmaken, niet op druk. Geen publieke bron ondersteunt een marktomvangschatting.

Concurrentpagina’s

  • Example A — productpagina (vastgelegd op 2026-10-30)
  • Example B — productpagina (vastgelegd op 2026-10-30)

Wat kopers melden

  • @example_buyer: “Derde vervanging in een jaar; de afdichting begeeft het.” — 2026-10-19
  • @example_home: “Schoonmaken kost minuten en niemand noemt het.” — 2026-10-24

Prijspositionering

Prijzen zijn op 2026-10-30 vastgelegd van de gelinkte pagina’s. Ze vallen in twee niveaus; elke pagina wordt direct geciteerd, niet gemiddeld.

Risico’s en open vragen

  • Duurzaamheid van de afdichting is de meest herhaalde klacht.
  • Geen bron dekt retourpercentages.
  • Controleer levertijden en landed cost vóór bestellen.

Bronnen

  • https://example.com/product-a — 2026-10-30
  • https://x.com/example_buyer/status/... — 2026-10-19

De exacte aanroepen

Voor ontwikkelaars: dezelfde workflow als kopieerbare code in uitvoeringsvolgorde.

Exacte API-aanroepen tonen
  1. Vraag Chat om het categoriebeeld

    Begin met het onderbouwde antwoord, niet met een lege pagina: Chat doorzoekt het openbare web, rangschikt pagina’s en geeft gebruikte resources terug. Vraag in één query naar vraagcontext, substituten en veelvoorkomende klachten en bewaar de topresources als bewijslijst.

    product-research.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 niche = "portable espresso maker"; // replace with the category you are judging
    
    const context = await felo<ChatData>("/v2/chat", {
      query: `Demand, price bands, and buyer complaints for ${niche} in the US`,
    });
    
    const sources = context.data.resources.slice(0, 5);

    Voorbeelduitvoer

    {
      "answer": "Buyers compare on counter space and cleanup …",
      "sources": [
        { "link": "https://example.com/category-guide", "title": "…", "snippet": "…" }
      ]
    }
  2. Leg concurrentpagina’s vast

    Extraheer twee of drie concurrentproductpagina’s als Markdown met leesbaarheid. Het doel is de claim en de prijs op de pagina van vandaag, niet een herschreven specsheet. Houd URL en inhoud bij elkaar en noteer de ophaaldatum: een prijs zonder datum is een gerucht.

    product-research.ts
    const PRODUCT_PAGES = [
      { url: "https://example.com/product-a", title: "Example A — product page" },
      { url: "https://example.com/product-b", title: "Example B — product page" },
    ];
    
    type ExtractData = { data: { content: string } };
    
    const listings = await Promise.all(
      PRODUCT_PAGES.map((page) =>
        felo<ExtractData>("/v2/web/extract", {
          url: page.url,
          output_format: "markdown",
          with_readability: true,
        }).then((extracted) => ({ ...page, content: extracted.data.content })),
      ),
    );

    Voorbeelduitvoer

    [
      {
        "url": "https://example.com/product-a",
        "title": "Example A — product page",
        "content": "# Example A\n\nSpecs and price as displayed…"
      }
    ]
  3. Lees wat kopers op X melden

    Leverancierspagina’s noemen functies, kopers beschrijven fouten. Zoek de niche plus wrijvingswoorden — verzending, kwaliteit, terugbetaling — in de laatste 30 dagen en bewaar account, datum en link. Dit zijn anekdotes, geen vraagdata, en het memo moet dat zeggen.

    product-research.ts
    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() - 30 * 24 * 60 * 60 * 1000) / 1000);
    
    const search = await felo<XData>("/v2/x/tweet/search", {
      query: `"${niche}" (shipping OR quality OR refund)`,
      limit: 50,
      since_time: since,
    });
    
    const complaints = search.data.tweets;

    Voorbeelduitvoer

    { "data": { "tweets": [
      {
        "content": "Third replacement in a year; the seal fails.",
        "author": { "username": "example_buyer" },
        "created_at": "2026-10-19T15:02:00Z",
        "metrics": { "retweet_count": 1, "favorite_count": 12, "reply_count": 3 },
        "url": "https://x.com/example_buyer/status/..."
      }
    ] } }
  4. Schrijf het memo

    Deze stap is gewone code: breng categorieantwoord, ophaaldata, koperquotes en bronnenlijst samen in één Markdown. Wees eerlijk over open vragen — het memo is nuttig omdat het scheidt wat pagina’s bewijzen van wat je nog met een leverancier moet checken.

    product-research.ts
    const capturedOn = new Date().toISOString().slice(0, 10);
    
    const memo = [
      `# Product research — ${niche}`,
      "",
      "## Category context",
      context.data.answer,
      "",
      "## Competitor pages",
      ...listings.map(
        (page) => `- [${page.title}](${page.url}) — captured ${capturedOn}`,
      ),
      "",
      "## What buyers report",
      ...complaints.slice(0, 10).map(
        (post) =>
          `- @${post.author.username} (${post.created_at.slice(0, 10)}): ${post.content}`,
      ),
      "",
      "## Sources",
      ...sources.map((source) => `- [${source.title}](${source.link})`),
    ].join("\n");
    
    console.log(memo);
  5. Bewaar bewijs in een LiveDoc

    Draai één keer per niche: maak de LiveDoc en bewaar de short_id in de configuratie. Voeg concurrentpagina’s en Chat-bronnen toe als URL-resources zodat het archief dedupliceert, en het memo als document. Voor de aankoop kun je vastleggingen doorzoeken en zien welke prijzen bewogen.

    product-research.ts
    type LiveDocData = { data: { short_id: string } };
    
    const research = await felo<LiveDocData>("/v2/livedocs", {
      name: `Product research: ${niche}`,
      description: "Competitor pages, buyer posts, and the memo",
    });
    
    await felo(`/v2/livedocs/${research.data.short_id}/resources/urls`, {
      urls: [
        ...listings.map((page) => ({ url: page.url, title: page.title })),
        ...sources.map((source) => ({ url: source.link, title: source.title })),
      ].slice(0, 10),
    });
    
    await felo(`/v2/livedocs/${research.data.short_id}/resources/doc`, {
      title: `Product memo — ${capturedOn}`,
      content: memo,
    });

    Voorbeelduitvoer

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

Wat inbegrepen is

  • Onderbouwd categoriebeeld uit Chat en de pagina’s erachter
  • Concurrentpagina’s als Markdown met ophaaldatum
  • Koperklachten uit X met accounts, datums en links
  • Markdown-memo uit deze invoer
  • Eén LiveDoc met bewijs en memo

Wat het niet doet

  • Alleen openbare bronnen; betaalde marktrapporten, leveranciersoffertes en interne verkoopdata vallen buiten
  • Schat marktgrootte, verkoopvolume of marge niet
  • Prijzen worden vastgelegd zoals opgehaald, nooit genormaliseerd of gemiddeld
  • X-posts zijn anekdotes, geen vraagdata
  • Neemt geen contact op met leveranciers, plaatst geen orders en wijzigt geen listings

Vragen

Waar komt de marktcontext vandaan?

De Chat API geeft een onderbouwd antwoord en de gebruikte openbare pagina’s. Concurrentpagina’s komen uit jouw URL’s en worden met Web Fetch geëxtraheerd; koperposts komen uit X Search. Er worden geen privéverkoopdata gebruikt.

Zegt het of een product verkoopt?

Nee. Het ordent openbaar bewijs — categoriecontext, vastgelegde prijzen en koperklachten — en schrijft op wat onbekend is. Vraagvalidatie vereist je eigen data, zoals advertenties, pre-orders of leveranciersgesprekken.

Wat als de marketplace extractie blokkeert?

Web Fetch haalt openbare pagina’s één URL tegelijk op en sommige sites blokkeren. Gebruik een toegankelijke product- of leverancierspagina en laat het memo de ontbrekende vastlegging markeren in plaats van een prijs te gissen.

Hoe voorkom ik verouderde concurrentprijzen?

Elke prijs in het memo is gekoppeld aan de pagina-URL en ophaaldatum. Draai de extractie opnieuw vlak voor de aankoopbeslissing; het archief bewaart eerdere vastleggingen zodat je prijsbewegingen ziet.

Neemt het contact op met leveranciers of verkopers?

Nee. De workflow is alleen-lezen: pagina’s extraheren, openbare posts zoeken, lokaal memo schrijven. Het verstuurt geen berichten, plaatst geen orders en wijzigt geen listings.

Wat kost een onderzoek?

Elke Chat-, extractie- en X Search-aanroep verbruikt gebruikscredits; actuele tarieven staan op de prijspagina. De prompt vraagt goedkeuring voor uitgaven.

Gerelateerde workflows

Maak het van jou

Hetzelfde recept, aangepast aan hoe je echt oplevert.

Voeg reviewtranscripten toe

Zijn er reviewvideo’s, haal het transcript met YouTube Subtitling en voeg twee of drie citaten met timestamp toe aan de kopersectie. Een videoreview blijft de ervaring van één persoon, dus houd het anekdotelabel van X-posts.

Vergelijk twee kandidaten

Draai dezelfde stappen per kandidaat en zet de memo’s naast elkaar: geclaimde functies, vastgelegde prijs, terugkerende klacht en open vraag. De vergelijking blijft kwalitatief tot je eigen verkoop- of retourdata hebt.

Vernieuw voor de aankoop

Draai de extractie een dag voor de bestelling opnieuw. Houd dezelfde LiveDoc en voeg een nieuw memo toe, zodat het archief laat zien wat veranderde tussen bureauonderzoek en aankoop, inclusief een prijs buiten budget.

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