Felo API PlatformFelo API Platform

Nghiên cứu

Tạo bản phân tích đối thủ để đội bán hàng dùng ngay

Thu thập trang của đối thủ, bài viết xung quanh và điều người mua nói trên X, rồi dựng bản phân tích trong đó mỗi khẳng định có nguồn, ngày và trạng thái.

Thời gian30 phútMứcTrung cấpCập nhật2026-10-30
Dành cho aiProduct marketingCompetitive intelligenceSales enablement

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.

Lập bản phân tích đối thủ [tên đối thủ] cho [sản phẩm của chúng ta].

Phạm vi: [phân khúc], [khu vực], [ngôn ngữ]. Khung thời gian: [90 ngày qua / 12 tháng qua]. Quyết định mà nó hỗ trợ: [thay đổi giá / định vị khi ra mắt / xử lý phản đối].
Nguồn bắt đầu: [tên miền đối thủ], [URL trang giá], [URL changelog].

Tạo bản phân tích Markdown gồm:
1. Cách họ định vị chính mình, bằng lời của họ.
2. Bảng bằng chứng: nhận định, tên nguồn, URL, ngày, trạng thái (Verified / Vendor claim / Third-party / Signal / Inference / Not verified).
3. Giá: những gì trang ghi, kèm liên kết và ngày kiểm tra. Không bao giờ chép giá vào văn bản mà thiếu trang và ngày.
4. Nơi người mua phản đối, kèm tài khoản X và ngày, ghi nhãn là tín hiệu.
5. Việc chúng ta nên làm tiếp theo, ghi nhãn là khuyến nghị.
6. Danh sách nguồn đầy đủ.

Quy tắc:
- Trích dẫn cách họ định vị; không diễn giải thành phiên bản mạnh hơn.
- Tách tuyên bố của nhà cung cấp, báo chí bên thứ ba và suy luận của bạn. Ghi nhãn từng dòng.
- Không bịa giá, số liệu, tên khách hàng hay chuẩn so sánh. Dữ liệu thiếu ghi “Không có dữ liệu”.
- Chuyển khung thời gian và khu vực 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ố, gửi, lên lịch hay ghi vào CRM.
- Ghi kết quả vào ./competitor-teardown.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ụ phân tích (trích)

Phân tích đối thủ — [đối thủ], kiểm tra ngày 2026-10-30

Họ định vị thế nào

Tiêu đề trang chủ: “Nền tảng cho các nhóm hỗ trợ đang phát triển.” Trang danh mục: “Mọi thứ nhóm hỗ trợ của bạn cần.” Cả hai là tuyên bố của nhà cung cấp, trích nguyên văn.

Bảng bằng chứng

Nhận địnhNguồnNgàyTrạng thái
Định vị là nền tảng, không phải công cụ đơn lẻhttps://example.com/competitor/home2026-10-30Verified
Phát hành thay đổi hàng tuầnhttps://example.com/competitor/changelog2026-10-28Verified
Được nhắc trong tổng hợp độc lậphttps://example.com/roundup2026-10-27Third-party
Người mua nói onboarding chậmbài X trích dưới2026-10-14Signal
Enterprise là phân khúc lớn nhấtKhông có dữ liệu—Not verified

Giá

Trang giá có gói theo bậc và gói theo mức dùng. Không lặp lại mức giá ở đây; xem trang trực tiếp và ngày: https://example.com/competitor/pricing (2026-10-30).

Nơi người mua phản đối

@example_dev, 2026-10-14: “cài đặt mất nhiều thời gian hơn bản demo gợi ý.” Một bài có ngày; là phàn nàn, không phải ước lượng tần suất.

Khuyến nghị

Đưa thời gian đến kết quả đầu tiên lên đầu trang so sánh. Đây là suy luận của chúng ta, không phải tuyên bố của đối thủ.

Nguồn

  • https://example.com/competitor/home
  • https://example.com/competitor/pricing
  • https://example.com/competitor/changelog

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. Bắt đầu từ nền tảng có nguồn

    Chat trả câu trả lời và các trang đã dùng, tạo bản đồ nơi đối thủ được thảo luận. Coi câu trả lời là gợi ý, không phải nguồn: giữ liên kết, chúng cung cấp các dòng bên thứ ba. Helper dưới gửi key một lần và ném lỗi nếu không phải 2xx.

    competitor.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 competitor = "Example Competitor";
    const segment = "mid-market support teams";
    
    const baseline = await felo<ChatData>("/v2/chat", {
      query: `How does ${competitor} position itself for ${segment}? Include pricing and recent launches.`,
    });
    
    const seedSources = baseline.data.resources.slice(0, 5);

    Kết quả mẫu

    {
      "answer": "The competitor positions itself as …",
      "sources": [
        { "link": "https://example.com/competitor", "title": "…", "snippet": "…" }
      ]
    }
  2. Tải các trang họ kiểm soát

    Bài bên thứ ba cho biết mọi người nghĩ gì; trang của họ cho biết họ tuyên bố gì. Trích trang chủ, giá và changelog thành Markdown với chế độ đọc và ghi ngày tải: trang giá không ngày là bẫy.

    competitor.ts
    type ExtractData = { data: { content: string } };
    
    const ownedPages = [
      { url: "https://example.com/competitor/home", title: "Homepage" },
      { url: "https://example.com/competitor/pricing", title: "Pricing" },
      { url: "https://example.com/competitor/changelog", title: "Changelog" },
    ];
    
    const fetched = await Promise.all(
      ownedPages.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/competitor/pricing",
      "checkedAt": "2026-10-30",
      "content": "# Pricing\n\nExtracted page text…"
    }
  3. Xem người mua nói gì trên X

    Tìm trên X phản đối và cách lách về đối thủ. Giữ tài khoản và ngày mỗi bài; một trích dẫn có ngày chứng minh có phàn nàn, không chứng minh mức phổ biến. Bản phân tích đánh dấu là tín hiệu và không biến vài bài thành phần trăm.

    competitor.ts
    type XData = {
      data: {
        tweets: {
          content: string;
          author: { username: string };
          created_at: string;
          metrics: { retweet_count: number; favorite_count: number };
        }[];
      };
    };
    
    const since = Math.floor((Date.now() - 90 * 24 * 60 * 60 * 1000) / 1000);
    
    const buyerSignal = await felo<XData>("/v2/x/tweet/search", {
      query: `"${competitor}" (pricing OR onboarding OR migration)`,
      limit: 25,
      since_time: since,
    });
    
    const objections = buyerSignal.data.tweets.slice(0, 5);

    Kết quả mẫu

    { "data": { "tweets": [
      {
        "content": "setup took longer than the demo suggested",
        "author": { "username": "example_dev" },
        "created_at": "2026-10-14T09:20:00Z",
        "metrics": { "retweet_count": 3, "favorite_count": 24 }
      }
    ] } }
  4. Dựng phân tích với bảng bằng chứng

    Đây là bước biên tập: biến trang và bài X thành khẳng định, mỗi khẳng định có nguồn, ngày và trạng thái. Cột trạng thái giữ tài liệu trung thực: Verified cho điều trang nói, Vendor claim cho marketing, Third-party cho bài ngoài, Signal cho bài có ngày, Inference cho cách đọc của bạn và Not verified khi thiếu bằng chứng.

    competitor.ts
    const today = new Date().toISOString().slice(0, 10);
    
    const row = (claim: string, source: string, date: string, status: string) =>
      `| ${claim} | ${source} | ${date} | ${status} |`;
    
    const teardown = [
      `# Competitor teardown — ${competitor}`,
      `Scope: ${segment}. Checked ${today}.`,
      "",
      "| Claim | Source | Date | Status |",
      "| --- | --- | --- | --- |",
      row("Free tier listed on the pricing page", ownedPages[1].url, fetched[1].checkedAt, "Verified"),
      row("Positions as a platform, not a point tool", ownedPages[0].url, fetched[0].checkedAt, "Vendor claim"),
      row("Discussed in independent coverage", seedSources[0]?.link ?? "Not available", today, "Third-party"),
      row("Buyers report onboarding friction", "X post, quoted below", today, "Signal"),
      row("Most revenue comes from enterprise", "Not available", "—", "Not verified"),
      "",
      "## Recommendation",
      "Lead with time-to-first-result on the comparison page. Inference, not a competitor claim.",
    ].join("\n");
    
    console.log(teardown);

    Kết quả mẫu

    | Free tier listed on the pricing page | https://example.com/competitor/pricing | 2026-10-30 | Verified |
  5. Lưu vào LiveDoc cho lần cập nhật sau

    Tạo một LiveDoc mỗi đối thủ, thêm trang đã tải làm tài nguyên URL và bản phân tích làm tài liệu. Thêm lại URL được loại trùng, nên quý sau chỉ tải phần thay đổi và bản cũ vẫn ở cùng kho.

    competitor.ts
    type LiveDocData = { data: { short_id: string } };
    
    const teardownDoc = await felo<LiveDocData>("/v2/livedocs", {
      name: `Teardown: ${competitor}`,
      description: `Sources and teardown checked ${today}`,
    });
    
    await felo(`/v2/livedocs/${teardownDoc.data.short_id}/resources/urls`, {
      urls: fetched.map((page) => ({ url: page.url, title: page.title })),
    });
    
    await felo(`/v2/livedocs/${teardownDoc.data.short_id}/resources/doc`, {
      title: `Teardown ${today}`,
      content: teardown,
    });
    
    console.log(teardownDoc.data.short_id); // the next refresh reuses this LiveDoc

    Kết quả mẫu

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

Bao gồm

  • Nền tảng có nguồn từ Chat API và các trang đằng sau
  • Trang chủ, giá và changelog đối thủ ở dạng Markdown
  • Bình luận người mua có ngày từ X, đánh dấu là tín hiệu không phải bằng chứng
  • Bảng bằng chứng tách dữ kiện đã xác minh, tuyên bố nhà cung cấp và suy luận
  • LiveDoc giữ nguồn để lần sau không bắt đầu từ số 0

Không làm gì

  • Chỉ nguồn công khai; không phỏng vấn thắng/thua, ghi chú CRM hay dashboard riêng
  • Giá được liên kết và ghi ngày, không đóng băng vào bảng thiếu ngày kiểm tra
  • Độ phủ X không đầy đủ và không phải mẫu đại diện người mua
  • Không chọn định vị thay bạn; khuyến nghị được đánh dấu là suy luận
  • Không xuất bản phân tích hay ghi vào công cụ battlecard

Câu hỏi

Bằng chứng đến từ đâu?

Chat API trả nền tảng có nguồn và các trang đã dùng, Web Fetch chuyển trang đối thủ thành Markdown và X Search thêm bài có ngày. Mỗi dòng giữ nguồn và ngày, suy luận có trạng thái riêng.

Có thể làm nhiều đối thủ không?

Có. Chạy cùng prompt cho từng đối thủ và giữ một LiveDoc mỗi công ty. Trang so sánh chỉ ghép các dòng “đã xác minh”, không trộn bằng chứng hai lần chạy.

Có được trích giá của họ không?

Quy trình ghi điều trang giá nói, kèm liên kết và ngày kiểm tra. Không đóng băng mức giá vào văn bản vì giá thay đổi và số cũ tệ hơn không có số.

Còn ghi chú thắng/thua của chúng tôi?

Chỉ đọc nguồn công khai. Thêm ghi chú nội bộ làm tài liệu riêng trong LiveDoc và đánh dấu nội bộ; chúng không bao giờ được trích trong tài liệu cho khách.

Bao lâu cập nhật một lần?

Theo sự kiện, không theo lịch: đổi giá, ra mắt lớn hoặc bắt đầu chu kỳ bán hàng. Chạy lại cùng LiveDoc để quý trước nằm cạnh quý mới.

Một bản phân tích tốn bao nhiêu?

Mỗi lệnh chat, trích xuất và tìm X 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.

Cập nhật theo sự kiện, không theo lịch

Chạy lại khi đối thủ đổi giá, ra mắt lớn hoặc trước chu kỳ bán hàng. Giữ mỗi bản phân tích là tài liệu có ngày trong cùng LiveDoc để quý trước nằm cạnh quý mới.

Biến phân tích thành battlecard

Từ cùng bảng, viết một trang cho mỗi vai — người mua kinh tế, champion, người đánh giá kỹ thuật — chỉ dùng dòng `Verified`, kèm liên kết. Để `Inference` ngoài tài liệu cho khách.

So sánh hai đối thủ

Chạy quy trình mỗi đối thủ với LiveDoc riêng rồi dựng trang so sánh chỉ từ dòng `Verified` ở cả hai lần. Không bao giờ gộp hai lần chạy mà thiếu cột trạng thái.

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