Felo API PlatformFelo API Platform

Дослідження

Перетворіть пошуковий запит на SEO-бриф контенту

Подивіться, які сторінки відповідають сьогодні, прочитайте їх як Markdown, змапуйте питання, які вони покривають і пропускають, і напишіть бриф, з якого автор зробить структуру.

Час25 хвилинРівеньСереднійОновлено2026-10-30
Для когоКонтент-маркетингSEO-фахівціРедактори

Скопіювати промпт

Замініть поля в квадратних дужках і вставте в Claude Code, Codex або AI з доступом до термінала. Він встановить скіл Felo, запитає перед витратою кредитів і запустить процес.

Напиши SEO-бриф для запиту [цільовий запит] для [продукт або сайт].

Аудиторія: [читач]. Ринок і мова: [регіон], [мова]. Кут: [посібник / порівняння / сторінка продукту]. Рішення, яке він підтримує: [нова стаття / оновлення / закриття прогалини].

Спочатку прочитай, що зараз відповідає на цей запит, а потім складай структуру. Створи Markdown-бриф із:
1. Цільовим запитом і наміром, який ти виводиш, із доказами цього прочитання.
2. Тим, що охоплюють поточні сторінки: заголовок, URL і вступні розділи.
3. Питаннями, на які відповідають поточні сторінки, і тими, які вони пропускають.
4. Запропонованою структурою з одним рядком на розділ про те, що він має довести.
5. Доказами й прикладами з джерел із посиланнями.
6. Повним списком джерел.

Правила:
- Не заявляй обсяг пошуку, складність ключового слова, позицію чи трафік. Цей процес їх не вимірює; пиши «Тут не виміряно» замість числа.
- Не вигадуй статистику, цитати чи твердження про контент конкурентів.
- Описуй намір як прочитання сторінок, а не як виміряний факт.
- Цитати мають бути короткими, із зазначенням джерела й посиланням.
- Перетвори регіон і мову на явні значення.
- Перед витратою кредитів покажи заплановані виклики API і дочекайся мого схвалення.
- Нічого не публікуй, не плануй і не надсилай.
- Запиши результат у ./seo-brief.md і підсумуй його в чаті.

Копія також містить кроки встановлення й правила безпеки.

Що ви отримаєте

Приклад результату одного запуску. Не живе генерування.

Приклад брифа (фрагмент)

SEO-бриф — «як автоматизувати тріаж підтримки»

Цільовий запит та інтент

Запит: «як автоматизувати тріаж підтримки». Повернені сторінки починаються з кроків упровадження, а не зі сторінок продукту, тож інтент читається як how-to. Це прочитання сторінок, а не виміряний ярлик інтенту.

Що покривають поточні сторінки

СторінкаURLПочинається з
Автоматизація тріажу підтримки: практичний посібникhttps://example.com/guideПравила маршрутизації, потім теги
Чек-лист автоматизації тріажуhttps://example.com/checklistСам чек-лист

Питання, на які відповідають сторінки

  • Що змінює автоматизація тріажу
  • З яких правил маршрутизації почати

Питання, які пропущені

  • Як виміряти, чи тріаж справді покращився
  • Що робити, коли класифікатор помиляється

Запропонована структура

  1. Що змінює автоматизація тріажу — довести, що йдеться про чергу, а не про штат.
  2. Перші три правила маршрутизації — довести кожне прикладом.
  3. Як вимірювати першого місяця — довести метрикою, яку візьме керівник ops.
  4. Коли автоматизація помиляється — довести шлях ручного відкату.

Докази

  • Приклад правила маршрутизації з https://example.com/guide (перевірено 2026-10-30)

Тут не вимірюється

Обсяг пошуку, складність ключового слова й позиція. Цей процес читає публічні сторінки; він не звертається до пошукового індексу чи трекера позицій.

Джерела

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

Точні виклики

Для розробників: той самий процес як код, у порядку виконання.

Показати справжні виклики API
  1. Подивіться, хто відповідає сьогодні

    Запитайте Chat про запит і візьміть відповідь і цитовані сторінки. Ці сторінки — поточний конкурентний контент.

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

    Приклад результату

    {
      "answer": "Readers searching this usually want a step-by-step …",
      "sources": [
        { "link": "https://example.com/guide", "title": "…", "snippet": "…" }
      ]
    }
  2. Прочитайте сторінки як Markdown

    Завантажте три-п’ять найсильніших сторінок через Web Fetch як Markdown, зберігаючи заголовки й питання.

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

    Приклад результату

    {
      "url": "https://example.com/guide",
      "checkedAt": "2026-10-30",
      "content": "# Automating support triage\n\n## Routing rules\n…"
    }
  3. Змапуйте покриття й прогалини

    Вилучіть H2/H3 і питання FAQ кожної сторінки й зробіть таблицю: які питання мають відповідь, а які ні.

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

    Приклад результату

    // questions
    [
      { "page": "…", "heading": "What routes should you automate first?" }
    ]
  4. Напишіть бриф

    Опишіть запит, намір, порівняння покриття, відсутні питання, запропоновану структуру й список джерел.

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

    Приклад результату

    # SEO brief — "how to automate support triage"
  5. Збережіть у LiveDoc

    Збережіть бриф і посилання на сторінки в LiveDoc, щоб наступне оновлення завантажувало лише зміни.

    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

    Приклад результату

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

Що входить

  • Список сторінок із джерелами з Chat і посиланнями на відповідь
  • Поточні провідні сторінки як Markdown
  • Заголовки й питання, які вони покривають
  • Бриф, з якого одразу виходить структура
  • LiveDoc із джерелами для наступного оновлення

Чого не робить

  • Не вимірює позиції, обсяг, складність чи трафік
  • Лише публічні сторінки; вхід і paywall можуть не працювати
  • Не публікує й не переписує всю статтю
  • Один запуск на запит; кілька запитів потребують вашого циклу
  • Не гарантує позицій

Запитання

Чи вимірює обсяг або позиції?

Ні. Він читає публічні сторінки й оцінює, який контент відповідає сьогодні; позиції й обсяг — у ваших SEO-інструментах.

Звідки дані?

Chat повертає сторінки з джерелами, а Web Fetch перетворює їх на Markdown. Кожна оцінка вказує на конкретну сторінку й дату.

Чи витримує кілька запитів?

Так, але по одному. Повторіть кроки для кожного запиту й зберігайте окремі брифі.

Для яких запитів?

Інформаційних, порівняльних і «як зробити», бо публічні сторінки дають достатньо сигналу. Транзакційні потребують ваших даних про продукт і конверсії.

Чи пише статтю?

Ні. Дає бриф і структуру; написання — за редактором або вашим агентом письма.

Скільки коштує один запуск?

Chat і вилучення витрачають кредити за використання; актуальні тарифи на сторінці цін. Промпт просить схвалення перед витратою.

Пов’язані процеси

Адаптуйте

Той самий рецепт, підлаштований під те, як ви насправді працюєте.

Лише порівняльні запити

Обмежте «X vs Y» і «найкращий X», щоб краще побачити кут відмінності.

Додайте свою сторінку продукту

Додайте сторінку продукту як додаткове джерело, щоб структура спиралася на ваші функції й ціни.

Оновлюйте щокварталу

Запустіть знову в тому самому LiveDoc і подивіться, як змінюються сторінки конкурентів і структура.

Довідкові сторінки за цим рецептом і наступні кроки.