Felo API PlatformFelo API Platform

Nghiên cứu

Biến một truy vấn tìm kiếm thành báo cáo nội dung SEO

Xem trang nào đang trả lời truy vấn, đọc chúng dưới dạng Markdown, lập bản đồ câu hỏi được trả lời và bị bỏ qua, rồi viết báo cáo để người viết dựng dàn ý.

Thời gian25 phútMứcTrung cấpCập nhật2026-10-30
Dành cho aiContent marketingChuyên viên SEOBiên tập

Sao chép prompt

Thay các trường trong ngoặc vuông rồi dán vào Claude Code, Codex hoặc AI có quyền truy cập terminal. Nó cài skill Felo, hỏi trước khi dùng credit và chạy quy trình.

Viết bản tóm tắt nội dung SEO cho truy vấn [truy vấn mục tiêu] cho [sản phẩm hoặc trang web].

Độc giả: [người đọc]. Thị trường và ngôn ngữ: [khu vực], [ngôn ngữ]. Góc tiếp cận: [hướng dẫn / so sánh / trang sản phẩm]. Quyết định mà nó hỗ trợ: [bài mới / làm mới / bù lỗ hổng].

Đọc những gì đang trả lời truy vấn này trước khi lập dàn ý. Tạo bản tóm tắt Markdown gồm:
1. Truy vấn mục tiêu và ý định tìm kiếm bạn suy ra, kèm bằng chứng cho cách đọc đó.
2. Những gì các trang hiện tại bao phủ: tiêu đề, URL và các mục mở đầu.
3. Câu hỏi mà các trang hiện tại trả lời và câu hỏi họ bỏ sót.
4. Dàn ý đề xuất với một dòng cho mỗi mục nói rõ mục đó phải chứng minh điều gì.
5. Bằng chứng và ví dụ từ các nguồn, kèm liên kết.
6. Danh sách nguồn đầy đủ.

Quy tắc:
- Không tuyên bố lượng tìm kiếm, độ khó từ khóa, thứ hạng hay lưu lượng. Quy trình này không đo những thứ đó; ghi “Không đo tại đây” thay vì một con số.
- Không bịa thống kê, trích dẫn hay nhận định về nội dung của đối thủ.
- Mô tả ý định như cách đọc các trang, không phải sự thật đã đo.
- Giữ trích dẫn ngắn, ghi nguồn và có liên kết.
- Chuyển khu vực và ngôn ngữ thành giá trị rõ ràng.
- Trước khi tiêu tín dụng, hiển thị các lệnh gọi API dự định và chờ tôi phê duyệt.
- Không công bố, lên lịch hay gửi gì.
- Ghi kết quả vào ./seo-brief.md và tóm tắt trong chat.

Bản sao cũng gồm các bước cài đặt và quy tắc an toàn.

Bạn nhận được gì

Kết quả mẫu của một lần chạy. Không phải tạo trực tiếp.

Ví dụ bản tóm tắt (trích)

SEO brief — “cách tự động hóa phân loại hỗ trợ”

Truy vấn mục tiêu và ý định

Truy vấn: “cách tự động hóa phân loại hỗ trợ”. Các trang trả về bắt đầu bằng bước triển khai, không phải trang sản phẩm, nên ý định đọc là how-to. Đây là cách đọc trang, không phải nhãn ý định đo được.

Các trang hiện tại bao phủ gì

TrangURLBắt đầu bằng
Tự động hóa phân loại hỗ trợ: hướng dẫn thực hànhhttps://example.com/guideQuy tắc định tuyến, rồi thẻ
Checklist tự động hóa phân loạihttps://example.com/checklistChính checklist

Câu hỏi các trang trả lời

  • Tự động hóa phân loại thay đổi gì
  • Bắt đầu từ quy tắc định tuyến nào

Câu hỏi còn thiếu

  • Cách đo xem phân loại có thực sự tốt hơn
  • Làm gì khi bộ phân loại sai

Dàn ý đề xuất

  1. Tự động hóa phân loại thay đổi gì — chứng minh là về hàng đợi, không phải nhân sự.
  2. Ba quy tắc định tuyến đầu tiên nên tự động hóa — chứng minh từng quy tắc bằng ví dụ.
  3. Cách đo trong tháng đầu — chứng minh bằng chỉ số mà trưởng vận hành lấy được.
  4. Khi tự động hóa sai — chứng minh đường dự phòng cho con người.

Bằng chứng

  • Ví dụ quy tắc định tuyến, trích từ https://example.com/guide (kiểm tra 2026-10-30)

Không đo tại đây

Lượng tìm kiếm, độ khó từ khóa và thứ hạng. Quy trình này đọc trang công khai; không truy vấn chỉ mục tìm kiếm hay công cụ theo dõi thứ hạng.

Nguồn

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

Các lệnh gọi chính xác

Dành cho lập trình viên: cùng quy trình dưới dạng mã, theo thứ tự chạy.

Hiện lệnh gọi API thật
  1. Xem ai đang trả lời

    Hỏi Chat về truy vấn và lấy câu trả lời cùng trang được trích. Đó là nội dung cạnh tranh hiện tại.

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

    Kết quả mẫu

    {
      "answer": "Readers searching this usually want a step-by-step …",
      "sources": [
        { "link": "https://example.com/guide", "title": "…", "snippet": "…" }
      ]
    }
  2. Đọc trang dưới dạng Markdown

    Tải ba đến năm trang mạnh nhất bằng Web Fetch thành Markdown, giữ tiêu đề và câu hỏi.

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

    Kết quả mẫu

    {
      "url": "https://example.com/guide",
      "checkedAt": "2026-10-30",
      "content": "# Automating support triage\n\n## Routing rules\n…"
    }
  3. Lập bản đồ độ phủ và lỗ hổng

    Trích H2/H3 và câu hỏi FAQ mỗi trang, lập bảng: câu nào được trả lời, câu nào không.

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

    Kết quả mẫu

    // questions
    [
      { "page": "…", "heading": "What routes should you automate first?" }
    ]
  4. Viết báo cáo

    Mô tả truy vấn, ý định, so sánh độ phủ, câu hỏi thiếu, dàn ý đề xuất và danh sách nguồn.

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

    Kết quả mẫu

    # SEO brief — "how to automate support triage"
  5. Lưu vào LiveDoc

    Lưu báo cáo và liên kết trang vào LiveDoc để lần sau chỉ tải thay đổi.

    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

    Kết quả mẫu

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

Bao gồm

  • Danh sách trang có nguồn từ Chat và liên kết trả lời
  • Trang hàng đầu hiện tại ở dạng Markdown
  • Tiêu đề và câu hỏi chúng bao phủ
  • Báo cáo có thể dựng dàn ý ngay
  • LiveDoc với nguồn cho lần cập nhật sau

Không làm gì

  • Không đo thứ hạng, lượng tìm, độ khó hay traffic
  • Chỉ trang công khai; đăng nhập và tường phí có thể lỗi
  • Không xuất bản hay viết lại toàn bài
  • Một lần chạy mỗi truy vấn; nhiều truy vấn cần vòng lặp của bạn
  • Không bảo đảm thứ hạng

Câu hỏi

Có đo lượng tìm hay thứ hạng không?

Không. Nó đọc trang công khai và đánh giá nội dung nào đang trả lời; thứ hạng và lượng tìm thuộc công cụ SEO của bạn.

Dữ liệu đến từ đâu?

Chat trả trang có nguồn và Web Fetch chuyển thành Markdown. Mỗi đánh giá trỏ tới trang và ngày cụ thể.

Có xử lý nhiều truy vấn không?

Có, nhưng mỗi lần một truy vấn. Lặp các bước cho từng truy vấn và lưu báo cáo riêng.

Phù hợp truy vấn nào?

Thông tin, so sánh và “cách làm”, vì trang công khai cho đủ tín hiệu. Truy vấn giao dịch cần dữ liệu sản phẩm và chuyển đổi của bạn.

Có viết bài không?

Không. Nó đưa báo cáo và dàn ý; việc viết do biên tập hoặc writing agent.

Một lần chạy tốn bao nhiêu?

Chat và trích xuất dùng credit theo mức dùng; giá hiện tại ở trang giá. Prompt hỏi duyệt trước khi chi.

Quy trình liên quan

Tùy biến

Cùng công thức, điều chỉnh theo cách bạn thực sự triển khai.

Chỉ truy vấn so sánh

Giới hạn ở “X vs Y” và “tốt nhất X” để thấy góc khác biệt.

Thêm trang sản phẩm của bạn

Thêm trang sản phẩm làm nguồn phụ để dàn ý bám tính năng và giá của bạn.

Cập nhật mỗi quý

Chạy lại cùng LiveDoc và xem trang đối thủ, dàn ý thay đổi thế nào.

Các trang tham chiếu đằng sau công thức và nơi đi tiếp.