Исследования
Превратите один поисковый запрос в SEO-бриф для контента
Посмотрите, какие страницы сейчас отвечают на запрос, прочитайте их как Markdown, сопоставьте вопросы, на которые они отвечают и которые пропускают, и напишите бриф, по которому автор сразу составит план.
Скопировать промпт
Замените поля в квадратных скобках и вставьте в 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 | Сам чек-лист |
Вопросы, на которые отвечают страницы
- Что меняет автоматизация триажа
- С каких правил маршрутизации начать
Вопросы, которые упускаются
- Как измерить, стало ли лучше
- Что делать, если классификатор ошибается
Предлагаемая структура
- Что меняет автоматизация триажа — доказать, что дело в очереди, а не в численности.
- Первые три правила маршрутизации — доказать каждое примером.
- Как измерить в первый месяц — доказать метрикой, которую достанет операционный руководитель.
- Когда автоматизация ошибается — доказать путь ручного отката.
Доказательства
- Пример правила маршрутизации из https://example.com/guide (проверено 2026-10-30)
Здесь не измеряется
Поисковый объём, сложность ключевого слова и позиция. Процесс читает публичные страницы; он не обращается к поисковому индексу или трекеру позиций.
Источники
- https://example.com/guide
- https://example.com/checklist
Реальные вызовы
Для разработчиков: тот же процесс в виде кода в порядке выполнения.
Показать реальные вызовы API
Посмотрите, кто отвечает сейчас
Спросите 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": "…" } ] }Прочитайте страницы как Markdown
Загрузите 3–5 сильнейших страниц через 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…" }Сопоставьте покрытие и пробелы
Извлеките 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?" } ]Напишите бриф
Опишите целевой запрос, интент, сравнение покрытия, пропущенные вопросы, предложенный план и список источников.
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"
Сохраните в 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 с источниками для следующего обновления
Чего не делает
- Не измеряет позиции, объём поиска, сложность ключевых слов и трафик
- Только публичные страницы; логин и пейволлы могут не открыться
- Не публикует и не переписывает статью целиком
- Один запуск на запрос; несколько запросов — цикл на вашей стороне
- Не гарантирует позиции
Вопросы
Он измеряет объём поиска или позиции?
Нет. Он читает публичные страницы и оценивает, какой контент сейчас отвечает на запрос; позиции и объём смотрите в своих SEO-инструментах.
Откуда данные?
Chat возвращает страницы с источниками, Web Fetch превращает их в Markdown. Каждая оценка в брифе указывает на конкретную страницу и дату.
Можно обработать несколько запросов?
Да, но по одному за раз. Для нескольких повторите шаги для каждого запроса и сохраните отдельные брифы.
Для каких запросов подходит?
Для информационных, сравнительных и «как сделать». Публичные страницы дают достаточно сигналов. Для транзакционных нужны ваши данные о продукте и конверсии.
Он пишет статью?
Нет. Он выдаёт бриф и план, а пишет редактор или ваш писательский agent.
Сколько стоит один запуск?
Chat и извлечение страниц расходуют кредиты по факту использования; актуальные тарифы на странице цен. Промпт просит одобрение до трат.
Связанные процессы
Превратите один вопрос в исследовательский бриф с источниками
Спросите веб, сохраните страницы, на которых основан ответ, как Markdown, добавьте мнения практиков из X и оставьте доказательства в LiveDoc, который можно будет искать позже.
Открыть рабочий процессКонтентЗаполните месяц контентом по вопросам вашей аудитории
Соберите темы в Chat, найдите вопросы аудитории в X, возьмите реальный угол из транскрипта видео и составьте календарь на четыре недели, где каждая строка имеет доказательство.
Открыть рабочий процессКонтентВыпускайте ежедневный AI-дайджест, который команда действительно читает
Получите подборку новостей с источниками, добавьте обсуждения практиков в X, загрузите один транскрипт видео, соберите выпуск в Markdown и сохраните его в LiveDoc.
Открыть рабочий процессАдаптируйте под себя
Тот же рецепт, подстроенный под ваш реальный процесс.
Только сравнительные запросы
Ограничьтесь «X vs Y» и «лучший X», чтобы легче увидеть угол дифференциации.
Добавьте свою страницу продукта
Добавьте страницу продукта как дополнительный источник, чтобы план опирался на ваши функции и цены.
Обновляйте раз в квартал
Перезапускайте с тем же LiveDoc и смотрите, как меняются конкуренты и предложенный план.
Продолжить
Справочные страницы этого рецепта и куда двигаться дальше.