Felo API PlatformFelo API Platform

Badania

Zamień zapytanie w brief treści SEO

Zobacz, które strony odpowiadają dziś, przeczytaj je jako Markdown, zmapuj pytania pokryte i pominięte, a potem napisz brief, z którego redaktor zrobi outline.

Czas25 minutPoziomŚredniZaktualizowano2026-10-30
Dla kogoContent marketingSpecjaliści SEORedaktorzy

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.

Napisz briefing treści SEO dla zapytania [zapytanie docelowe] dla [produkt lub strona].

Odbiorcy: [czytelnik]. Rynek i język: [region], [język]. Kąt: [poradnik / porównanie / strona produktu]. Decyzja, którą wspiera: [nowy artykuł / odświeżenie / uzupełnienie luki].

Najpierw przeczytaj, co dziś odpowiada na to zapytanie, zanim zrobisz konspekt. Przygotuj briefing w Markdown zawierający:
1. Zapytanie docelowe i intencję, którą wnioskujesz, z dowodami tej interpretacji.
2. Co obejmują obecne strony: tytuł, URL i sekcje otwierające.
3. Pytania, na które odpowiadają obecne strony, i te, które pomijają.
4. Proponowany konspekt z jedną linią na sekcję mówiącą, co ma dowieść.
5. Dowody i przykłady ze źródeł, z linkami.
6. Pełną listę źródeł.

Zasady:
- Nie twierdź, że znasz wolumen wyszukiwań, trudność frazy, pozycję lub ruch. Ten workflow tego nie mierzy; pisz „Tu nie zmierzono” zamiast liczby.
- Nie wymyślaj statystyk, cytatów ani twierdzeń o treściach konkurencji.
- Opisuj intencję jako odczytanie stron, nie jako zmierzony fakt.
- Cytaty krótkie, z atrybucją i linkiem.
- Zamień region i język na konkretne wartości.
- Zanim zużyjesz kredyty, pokaż planowane wywołania API i poczekaj na moją zgodę.
- Nie publikuj, nie planuj i niczego nie wysyłaj.
- Zapisz wynik w ./seo-brief.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 SEO — „jak zautomatyzować triage wsparcia”

Zapytanie docelowe i intencja

Zapytanie: „jak zautomatyzować triage wsparcia”. Zwrócone strony zaczynają się od kroków wdrożenia, nie od stron produktu, więc intencja czyta się jako how-to. To odczytanie stron, nie zmierzona etykieta intencji.

Co obejmują obecne strony

StronaURLZaczyna się od
Automatyzacja triage wsparcia: praktyczny przewodnikhttps://example.com/guideReguły routingu, potem tagi
Checklista automatyzacji triagehttps://example.com/checklistSama checklista

Pytania, na które odpowiadają

  • Co zmienia automatyzacja triage
  • Od których reguł routingu zacząć

Pytania pominięte

  • Jak zmierzyć, czy triage naprawdę się poprawił
  • Co zrobić, gdy klasyfikator się myli

Proponowany układ

  1. Co zmienia automatyzacja triage — dowieść, że chodzi o kolejkę, nie o etaty.
  2. Pierwsze trzy reguły routingu — dowieść każdą przykładem.
  3. Jak mierzyć w pierwszym miesiącu — dowieść metryką, którą lider ops może wyciągnąć.
  4. Gdy automatyzacja się myli — dowieść ścieżki odwrotu do człowieka.

Dowody

  • Przykład reguły routingu, cytowany z https://example.com/guide (sprawdzono 2026-10-30)

Nie zmierzono tutaj

Wolumen wyszukiwania, trudność frazy i pozycja. Ten workflow czyta publiczne strony; nie pyta indeksu wyszukiwania ani trackera pozycji.

Źródła

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

Dokładne wywołania

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

Pokaż rzeczywiste wywołania API
  1. Zobacz, kto odpowiada dziś

    Zapytaj Chat o zapytanie i weź odpowiedź oraz cytowane strony. Te strony to obecna konkurencyjna treść.

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

    Przykładowy wynik

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

    Pobierz trzy do pięciu najmocniejszych stron przez Web Fetch jako Markdown, zachowując nagłówki i pytania.

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

    Przykładowy wynik

    {
      "url": "https://example.com/guide",
      "checkedAt": "2026-10-30",
      "content": "# Automating support triage\n\n## Routing rules\n…"
    }
  3. Zmapuj pokrycie i luki

    Wyekstrahuj H2/H3 i pytania FAQ z każdej strony i zrób tabelę: które pytania są odpowiedziane, a które nie.

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

    Przykładowy wynik

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

    Opisz zapytanie, intencję, porównanie pokrycia, brakujące pytania, proponowany outline i listę źródeł.

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

    Przykładowy wynik

    # SEO brief — "how to automate support triage"
  5. Zapisz w LiveDoc

    Zapisz brief i linki stron w LiveDoc, żeby kolejna aktualizacja pobierała tylko zmiany.

    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

    Przykładowy wynik

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

Co zawiera

  • Lista stron ze źródłami z Chat i linkami odpowiedzi
  • Obecne czołowe strony jako Markdown
  • Nagłówki i pytania, które pokrywają
  • Brief, z którego od razu powstaje outline
  • LiveDoc ze źródłami na kolejną aktualizację

Czego nie robi

  • Nie mierzy pozycji, wolumenu, trudności ani ruchu
  • Tylko strony publiczne; logowanie i paywall mogą zawieść
  • Nie publikuje ani nie przepisuje całego artykułu
  • Jedno uruchomienie na zapytanie; kilka wymaga twojej pętli
  • Nie gwarantuje pozycji

Pytania

Czy mierzy wolumen lub pozycje?

Nie. Czyta publiczne strony i ocenia, które treści odpowiadają dziś; pozycje i wolumen są w twoich narzędziach SEO.

Skąd dane?

Chat zwraca strony ze źródłami, a Web Fetch zamienia je w Markdown. Każda ocena wskazuje konkretną stronę i datę.

Czy obsługuje kilka zapytań?

Tak, ale po jednym. Powtórz kroki dla każdego zapytania i zapisuj osobne briefy.

Do jakich zapytań?

Informacyjnych, porównawczych i „jak zrobić”, bo publiczne strony dają dość sygnału. Transakcyjne wymagają danych produktu i konwersji.

Czy pisze artykuł?

Nie. Daje brief i outline; pisanie należy do redaktora lub twojego agenta piszącego.

Ile kosztuje jedno uruchomienie?

Chat i ekstrakcja zużywają 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.

Tylko zapytania porównawcze

Ogranicz do „X vs Y” i „najlepszy X”, by lepiej zobaczyć kąt wyróżnienia.

Dodaj swoją stronę produktu

Dodaj stronę produktu jako dodatkowe źródło, żeby outline opierał się na twoich funkcjach i cenach.

Odświeżaj co kwartał

Uruchom ponownie w tym samym LiveDoc i zobacz, jak zmieniają się strony konkurentów i outline.

Strony referencyjne za tą recepturą i kolejne kroki.