Felo API PlatformFelo API Platform

リサーチ

営業チームがそのまま使える競合分析を作る

競合自身のページ、周辺の報道、X での買い手の声を集め、主張ごとに出典・日付・ステータスを持つ分析にまとめます。

所要時間30 分レベル中級更新日2026-10-30
対象プロダクトマーケ競合インテリジェンスセールスイネーブルメント

プロンプトをコピー

角括弧の項目を置き換えて、Claude Code、Codex、ターミナルにアクセスできる AI に貼り付けてください。Felo スキルをインストールし、クレジットを使う前に確認し、ワークフローを実行します。

[自社製品] のための [競合名] の競合分析を作成してください。

対象: [セグメント]、[地域]、[言語]。期間: [過去90日 / 過去12か月]。この分析が支える意思決定: [価格変更 / ローンチ時のポジショニング / 反論対応]。
開始する情報源: [競合ドメイン]、[価格ページの URL]、[変更履歴の URL]。

Markdown の分析に以下を含めてください。
1. 競合が自社をどう位置づけているか(本人たちの言葉で)。
2. 根拠表: 主張、出典タイトル、URL、日付、ステータス(Verified / Vendor claim / Third-party / Signal / Inference / Not verified)。
3. 価格: ページに書かれている内容、リンク、確認日。ページと日付なしに料金を本文へ転記しないでください。
4. 購入者が反発する点(X のアカウントと日付を添え、シグナルとして表示)。
5. 次に取るべき行動(推奨として表示)。
6. 出典の完全な一覧。

ルール:
- 競合のポジショニングは引用し、より強い主張に言い換えないでください。
- ベンダーの主張、第三者による報道、あなた自身の推論を分け、すべての行にラベルを付けてください。
- 価格、数値、顧客名、ベンチマークを捏造しないでください。データがない場合は「該当データなし」と書いてください。
- 期間と地域を明示的な値に解決してください。
- クレジットを消費する前に、実行予定の API 呼び出しを示して私の承認を待ってください。
- 公開、送信、予約、CRM への書き込みはしないでください。
- 結果を ./competitor-teardown.md に書き、チャットで要約してください。

コピー内容にはインストール手順と安全ルールも含まれます。

完成するもの

実行時の出力例です。リアルタイム生成ではありません。

競合分析の例(抜粋)

競合分析 — [競合]、2026-10-30 確認

彼らの自己位置づけ

トップページの見出し:「成長するサポートチームのためのプラットフォーム」。カテゴリページ:「サポートチームに必要なすべて」。どちらもベンダーの主張で、書かれたまま引用。

根拠表

主張出典日付ステータス
単機能ではなくプラットフォームとして位置づけhttps://example.com/competitor/home2026-10-30Verified
毎週変更を出荷https://example.com/competitor/changelog2026-10-28Verified
独立系まとめで取り上げられたhttps://example.com/roundup2026-10-27Third-party
オンボーディングの遅さに言及する買い手がいる下に引用した X 投稿2026-10-14Signal
エンタープライズが最大セグメント該当データなし—Not verified

価格

価格ページには段階制プランと従量制プランがある。ここでは料金を繰り返さない。最新ページと日付を確認: https://example.com/competitor/pricing (2026-10-30)。

買い手が反発する点

@example_dev、2026-10-14:「セットアップはデモの説明より時間がかかった」。日付付きの1投稿であり、頻度の推定ではない。

推奨

比較ページでは「最初の結果までの時間」を前面に出す。これは私たちの推論で、競合の主張ではない。

出典

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

実際の呼び出し

開発者向け:同じワークフローを実行順に並べたコピー可能なコード。

実際の API 呼び出しを表示
  1. 出典付きの基準から始める

    Chat は回答と使用ページを返すので、競合がどこで語られているかの地図が得られます。回答は手がかり、出典はリンクです。リンクを残し、証拠表の第三者行に使います。下の helper はキーを一度送り、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);

    出力例

    {
      "answer": "The competitor positions itself as …",
      "sources": [
        { "link": "https://example.com/competitor", "title": "…", "snippet": "…" }
      ]
    }
  2. 競合が管理するページを取得する

    第三者の報道は世間の見方を、競合自身のページは彼らの主張を伝えます。readability を有効にしてホームページ、料金ページ、changelog を Markdown で抽出し、取得日を記録します。日付のない料金ページは罠です。

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

    出力例

    {
      "url": "https://example.com/competitor/pricing",
      "checkedAt": "2026-10-30",
      "content": "# Pricing\n\nExtracted page text…"
    }
  3. X で買い手の声を確認する

    競合に対する不満や回避策を X で検索します。各投稿のハンドルと日付を残します。日付付きの引用1件は「不満があった」証拠であり、「どれくらい一般的か」の証拠ではありません。分析ではシグナルとラベルし、数件の投稿を割合にしません。

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

    出力例

    { "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. 証拠表で分析を組み立てる

    編集ステップです。取得ページと X 投稿を主張に変え、各主張に出典、日付、ステータスを付けます。ステータス列が文書を誠実に保ちます。ページに書かれたことは Verified、ベンダーのマーケティングは Vendor claim、外部報道は Third-party、日付付き投稿は Signal、あなたの解釈は Inference、証拠なしは Not verified です。

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

    出力例

    | Free tier listed on the pricing page | https://example.com/competitor/pricing | 2026-10-30 | Verified |
  5. 次回更新用に LiveDoc へ保存する

    競合ごとに LiveDoc を1つ作り、取得ページを URL リソースとして追加し、分析自体をドキュメントリソースとして追加します。URL の再追加は重複排除されるので、次の四半期は変わった部分だけを取得し、前回の分析も同じアーカイブに残ります。

    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

    出力例

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

含まれるもの

  • Chat API の出典付き基準とその根拠ページ
  • 競合のホームページ、料金、changelog の Markdown 抽出
  • 証拠ではなくシグナルとしてラベルした日付付き X 買い手コメント
  • 検証済み事実、ベンダー主張、推論を分ける証拠表
  • 次回更新をゼロから始めなくて済む LiveDoc

やらないこと

  • 公開ソースのみ。勝敗インタビュー、CRM メモ、社内ダッシュボードは扱わない
  • 料金はリンクと日付のみ。確認日のない表にレートを固定しない
  • X のカバレッジは不完全で、買い手の代表サンプルではない
  • ポジショニングは決めない。提言は推論として明示する
  • 分析を公開したり battlecard ツールに書き込んだりしない

よくある質問

証拠はどこから来ますか?

Chat API は出典付きの基準と使用ページを返し、Web Fetch が競合自身のページを Markdown にし、X Search が日付付きの買い手投稿を加えます。各行は出典と日付を保持し、推論には独自のステータスが付きます。

複数の競合を扱えますか?

はい。競合ごとに同じプロンプトを1回実行し、会社ごとに LiveDoc を1つ保持します。比較ページは「検証済み」の行だけを結合し、2回の実行の証拠を混ぜません。

競合の料金を引用できますか?

ワークフローは料金ページに書かれている内容を、リンクと確認日付きで記録します。レートを文章に固定しません。ベンダーの料金は変わるため、古い数字は数字がないより悪いからです。

自社の勝敗メモは使えますか?

公開ソースだけを読みます。社内メモは LiveDoc に別のドキュメントリソースとして追加し、社内とラベルしてください。顧客向け資料には引用されません。

どの頻度で更新すべきですか?

カレンダーではなくトリガーで更新します。料金変更、大きなリリース、営業サイクルの開始時です。同じ LiveDoc に対して再実行し、前四半期の分析を新しい分析の隣に残します。

分析1本の費用は?

各 chat、抽出、X 検索は従量制クレジットを使います。現在の料金は料金ページにあります。プロンプトは使う前に承認を求めます。

関連ワークフロー

自分の形に変える

同じレシピを、実際の進め方に合わせて調整します。

カレンダーではなくトリガーで更新する

競合が料金を変えたとき、大きなリリースをしたとき、大きな営業サイクルの前に同じワークフローを再実行します。各分析を同じ LiveDoc の日付付きドキュメントリソースとして残し、前四半期と並べます。

分析を battlecard にする

同じ証拠表から、経済的買い手、チャンピオン、技術レビュアーの3者向けに1ページずつ書き、`Verified` 行だけを使い、リンクを付けます。顧客向け資料に `Inference` を入れないでください。

2社を並べて比較する

競合ごとに別の LiveDoc で1回ずつ実行し、両方の実行で `Verified` になった行だけを結合した比較ページを作ります。ステータス列なしで2回の実行を1つの証拠表に混ぜないでください。

このレシピの背景にあるリファレンスと、次に見るべきページ。