Felo API PlatformFelo API Platform

Research

Eine Suchanfrage in ein SEO-Content-Briefing verwandeln

Sieh, welche Seiten die Anfrage heute beantworten, lies sie als Markdown, ordne beantwortete und fehlende Fragen und schreibe ein Briefing, aus dem ein Autor direkt eine Gliederung ableiten kann.

Dauer25 MinutenLevelFortgeschrittenAktualisiert2026-10-30
Für wenContent-MarketerSEO-SpezialistenEditoren

Prompt kopieren

Ersetze die Felder in eckigen Klammern und füge den Prompt in Claude Code, Codex oder eine KI mit Terminalzugriff ein. Sie installiert den Felo-Skill, fragt vor Credits und führt den Workflow aus.

Schreibe ein SEO-Content-Briefing für die Query [Ziel-Query] für [Produkt oder Website].

Zielgruppe: [Leser]. Markt und Sprache: [Region], [Sprache]. Blickwinkel: [Leitfaden / Vergleich / Produktseite]. Entscheidung, die es stützt: [neuer Artikel / Auffrischung / Lücke].

Lies zuerst, was diese Query aktuell beantwortet, bevor du gliederst. Erstelle ein Markdown-Briefing mit:
1. Der Ziel-Query und der abgeleiteten Suchintention, mit Belegen für diese Lesart.
2. Was die aktuellen Seiten abdecken: Titel, URL und die führenden Abschnitte.
3. Fragen, die die aktuellen Seiten beantworten, und Fragen, die sie verfehlen.
4. Einem vorgeschlagenen Aufbau mit einer Zeile pro Abschnitt, was er beweisen muss.
5. Belegen und Beispielen aus den Quellen, mit Links.
6. Einer vollständigen Quellenliste.

Regeln:
- Behaupte kein Suchvolumen, Keyword-Schwierigkeit, Ranking oder Traffic. Dieser Workflow misst das nicht; schreibe „Hier nicht gemessen“ statt einer Zahl.
- Erfinde keine Statistiken, Zitate oder Aussagen über Inhalte von Wettbewerbern.
- Beschreibe die Intention als Lesart der Seiten, nicht als gemessene Tatsache.
- Halte Zitate kurz, ordne sie zu und verlinke sie.
- Löse Region und Sprache in explizite Werte auf.
- Bevor Credits verbraucht werden, zeige die geplanten API-Aufrufe und warte auf meine Freigabe.
- Veröffentliche, plane oder versende nichts.
- Schreibe das Ergebnis nach ./seo-brief.md und fasse es im Chat zusammen.

Die Kopie enthält auch die Installationsschritte und Sicherheitsregeln.

Das bekommst du

Beispielausgabe eines Laufs. Keine Live-Generierung.

Beispiel-Briefing (Auszug)

SEO-Briefing — „Support-Triage automatisieren“

Ziel-Query und Intention

Query: „Support-Triage automatisieren“. Die zurückgegebenen Seiten beginnen mit Umsetzungsschritten, nicht mit Produktseiten, daher liest sich die Intention als How-to. Das ist eine Lesart der Seiten, kein gemessenes Intent-Label.

Was die aktuellen Seiten abdecken

SeiteURLBeginnt mit
Support-Triage automatisieren: ein Praxisleitfadenhttps://example.com/guideRouting-Regeln, dann Tags
Checkliste für Triage-Automatisierunghttps://example.com/checklistDer Checkliste selbst

Fragen, die die Seiten beantworten

  • Was Triage-Automatisierung ändert
  • Mit welchen Routing-Regeln man beginnt

Fragen, die sie verfehlen

  • Wie man misst, ob Triage wirklich besser wurde
  • Was tun, wenn der Klassifikator falsch liegt

Vorgeschlagene Gliederung

  1. Was Triage-Automatisierung ändert — beweisen, dass es um die Queue geht, nicht um Kopfzahl.
  2. Die ersten drei sinnvollen Routing-Regeln — jede mit einem Beispiel beweisen.
  3. Wie man es im ersten Monat misst — mit einer Kennzahl, die ein Ops-Lead ziehen kann.
  4. Wenn die Automatisierung falsch liegt — den menschlichen Fallback belegen.

Evidenz

  • Beispiel für eine Routing-Regel, zitiert aus https://example.com/guide (geprüft am 2026-10-30)

Hier nicht gemessen

Suchvolumen, Keyword-Schwierigkeit und Ranking. Dieser Workflow liest öffentliche Seiten; er fragt keinen Suchindex oder Rank-Tracker ab.

Quellen

  • https://example.com/guide
  • https://example.com/checklist

Die konkreten Aufrufe

Für Entwickler: derselbe Workflow als kopierbarer Code in Ausführungsreihenfolge.

Konkrete API-Aufrufe zeigen
  1. Sehen, wer heute antwortet

    Frage Chat nach der Anfrage und erhalte Antwort und zitierte Seiten. Diese Seiten sind der aktuelle Wettbewerbsinhalt.

    seo-brief.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 query = "how to automate support triage";
    const ourSite = "example.com";
    
    const coverage = await felo<ChatData>("/v2/chat", {
      query: `What pages currently answer the search query "${query}"? List the pages and what each one covers.`,
    });
    
    const candidates = coverage.data.resources
      .filter((resource) => !resource.link.includes(ourSite))
      .slice(0, 5)
      .map((resource) => ({ url: resource.link, title: resource.title }));

    Beispielausgabe

    {
      "answer": "Readers searching this usually want a step-by-step …",
      "sources": [
        { "link": "https://example.com/guide", "title": "…", "snippet": "…" }
      ]
    }
  2. Die Seiten als Markdown lesen

    Lade die drei bis fünf stärksten Seiten mit Web Fetch als Markdown und behalte Überschriften und Fragen.

    seo-brief.ts
    type ExtractData = { data: { content: string } };
    
    const pages = await Promise.all(
      candidates.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 };
      }),
    );

    Beispielausgabe

    {
      "url": "https://example.com/guide",
      "checkedAt": "2026-10-30",
      "content": "# Automating support triage\n\n## Routing rules\n…"
    }
  3. Abdeckung und Lücken ordnen

    Extrahiere H2/H3 und FAQ-Fragen jeder Seite und erstelle eine Tabelle: Welche Fragen sind beantwortet, welche fehlen?

    seo-brief.ts
    type Heading = { page: string; heading: string };
    
    const headings: Heading[] = pages.flatMap((page) =>
      page.content
        .split("\n")
        .filter((line) => line.startsWith("## "))
        .map((line) => ({
          page: page.title,
          heading: line.replace(/^##\s+/, ""),
        })),
    );
    
    const questions = headings.filter((item) => item.heading.includes("?"));
    
    const byTopic = new Map<string, string[]>();
    for (const item of headings) {
      byTopic.set(item.heading, [...(byTopic.get(item.heading) ?? []), item.page]);
    }

    Beispielausgabe

    // questions
    [
      { "page": "…", "heading": "What routes should you automate first?" }
    ]
  4. Das Briefing schreiben

    Beschreibe Zielanfrage, Intent, Abdeckungsvergleich, fehlende Fragen, vorgeschlagene Gliederung und Quellenliste.

    seo-brief.ts
    const today = new Date().toISOString().slice(0, 10);
    
    const brief = [
      `# SEO brief — "${query}"`,
      `Checked ${today}. Site: ${ourSite}.`,
      "",
      "## Intent read",
      "The pages returned for this query lead with: " +
        headings.slice(0, 6).map((item) => item.heading).join("; ") +
        ". This is a reading of their structure, not a measured intent label.",
      "",
      "## What the pages cover",
      "| Page | URL | Checked |",
      "| --- | --- | --- |",
      ...pages.map((page) => `| ${page.title} | ${page.url} | ${page.checkedAt} |`),
      "",
      "## Questions the pages answer",
      ...questions.map((item) => `- ${item.heading} (${item.page})`),
      "",
      "## Topics more than one page covers",
      ...[byTopic.entries()]
        .filter(([, pageTitles]) => pageTitles.length > 1)
        .map(([heading, pageTitles]) => `- ${heading} (${pageTitles.length} pages)`),
      "",
      "## Proposed outline",
      ...questions.slice(0, 5).map((item, index) => `${index + 1}. ${item.heading}`),
      "",
      "## Questions they miss",
      "<!-- Only questions none of the fetched pages answer. Delete this comment when filled. -->",
      "",
      "## Not measured here",
      "Search volume, keyword difficulty, and ranking position. This workflow reads public pages; it does not query a search index or a rank tracker.",
      "",
      "## Sources",
      ...pages.map((page) => `- ${page.title}: ${page.url}`),
    ].join("\n");
    
    console.log(brief);

    Beispielausgabe

    # SEO brief — "how to automate support triage"
  5. Im LiveDoc speichern

    Speichere Briefing und Seitenlinks im LiveDoc, damit das nächste Update nur Änderungen lädt.

    seo-brief.ts
    type LiveDocData = { data: { short_id: string } };
    
    const briefDoc = await felo<LiveDocData>("/v2/livedocs", {
      name: `SEO briefs: ${ourSite}`,
      description: "One document resource per target query",
    });
    
    await felo(`/v2/livedocs/${briefDoc.data.short_id}/resources/urls`, {
      urls: pages.map((page) => ({ url: page.url, title: page.title })),
    });
    
    await felo(`/v2/livedocs/${briefDoc.data.short_id}/resources/doc`, {
      title: `SEO brief — ${query}`,
      content: brief,
    });
    
    console.log(briefDoc.data.short_id); // the next query adds to this archive

    Beispielausgabe

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

Enthalten

  • Belegte Seitenliste aus Chat und Links zur Antwort
  • Aktuelle Top-Seiten als Markdown
  • Überschriften und Fragen, die sie abdecken
  • Ein Briefing, aus dem direkt eine Gliederung entsteht
  • LiveDoc mit Quellen für das nächste Update

Was es nicht macht

  • Misst keine Rankings, Suchvolumen, Keyword-Schwierigkeit oder Traffic
  • Nur öffentliche Seiten; Login und Paywall können fehlschlagen
  • Veröffentlicht oder schreibt den Artikel nicht um
  • Ein Lauf pro Anfrage; mehrere Anfragen brauchen deine Schleife
  • Garantiert keine Rankings

Fragen

Misst es Suchvolumen oder Rankings?

Nein. Es liest öffentliche Seiten und bewertet, welcher Inhalt die Anfrage heute beantwortet; Rankings und Volumen gehören in deine SEO-Tools.

Woher kommen die Daten?

Chat liefert belegte Seiten, Web Fetch macht sie zu Markdown. Jede Einschätzung im Briefing zeigt auf eine konkrete Seite und ein Datum.

Kann ich mehrere Anfragen bearbeiten?

Ja, aber eine nach der anderen. Wiederhole die Schritte pro Anfrage und speichere separate Briefings.

Für welche Anfragen eignet es sich?

Informations-, Vergleichs- und „Wie mache ich“-Anfragen, weil öffentliche Seiten genug Signal liefern. Transaktionale Anfragen brauchen zusätzlich deine Produkt- und Conversion-Daten.

Schreibt es den Artikel?

Nein. Es liefert Briefing und Gliederung; das Schreiben übernimmt der Editor oder dein Schreib-Agent.

Was kostet ein Lauf?

Chat und Seitenextraktion verbrauchen Credits; aktuelle Preise stehen auf der Preisseite. Der Prompt fragt vor Ausgaben nach Bestätigung.

Verwandte Workflows

Mach es zu deinem

Dasselbe Rezept, angepasst an deinen tatsächlichen Ablauf.

Nur Vergleichsanfragen

Beschränke dich auf „X vs Y“ und „bestes X“, um den Differenzierungswinkel leichter zu sehen.

Eigene Produktseite ergänzen

Nimm die Produktseite als zusätzliche Quelle auf, damit die Gliederung auf deinen Funktionen und Preisen landet.

Vierteljährlich aktualisieren

Führe es im selben LiveDoc erneut aus und beobachte, wie sich Wettbewerbsseiten und Gliederung ändern.

Die Referenzseiten hinter diesem Rezept und die nächsten Schritte.