Felo API PlatformFelo API Platform

コンテンツ

SNSの会話を週次のリスニングブリーフに変える

直近1週間の自社ブランドと競合に関する X 投稿を検索し、出典付きの Web 文脈を加え、その背景ページを読み、毎号をアーカイブして翌週は既知の内容から始めます。

所要時間25 分レベル中級更新日2026-10-30
対象ブランド・コミュニケーションプロダクトマーケコミュニティ管理

プロンプトをコピー

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

[ブランド、製品、カテゴリ] のソーシャルリスニングブリーフを実行してください。

監視語: [ブランド]、[製品名]、[競合名]、[カテゴリキーワード]。
期間: 過去 [7 / 14] 日。タイムゾーン: [タイムゾーン]。読者: [チーム]。
許可する情報源: 公開 X 投稿と公開 Web ページのみ。

以下を作成してください。
1. 会話の変化を5行で要約。
2. テーマごとに、人々が何を言っているか、それを支える投稿、投稿がカバーする日付範囲。
3. 競合への言及: 誰が、どの文脈で推薦されているか。
4. リスク: 苦情、障害、繰り返される質問、反発。
5. 次のアクションを「今すぐ返信」「監視」「製品へ共有」に分ける。
6. 出典一覧(すべての投稿とページの URL と日付)。

ルール:
- API が返した投稿とページだけを報告してください。感情スコア、エンゲージメント数、引用、出典を捏造しないでください。
- X はシグナルとして扱い、代表的な調査とはみなさないでください。結論を出すにはサンプルが小さすぎる場合はその旨を書いてください。
- 顧客自身の言葉とあなたの要約を分け、短く引用してリンクを付けてください。
- 期間を明示的な開始日と終了日に解決し、タイムゾーンを記載してください。
- クレジットを消費する前に、実行予定の検索と抽出を示して私の承認を待ってください。
- 返信、投稿、フォロー、メッセージ送信はしないでください。このブリーフは読み取り専用です。
- 結果を ./social-listening.md に書き、チャットで要約してください。

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

完成するもの

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

ブリーフの例(抜粋)

ソーシャルリスニングブリーフ — 2026-10-30

何が変わったか

  • エクスポートフローへの不満が最大のテーマになった。
  • 価格スレッドでより安い競合が推薦されている。
  • 2026-10-27 の障害はもう言及されていない。

テーマ

  1. アップデート以降エクスポートが遅い — @example_dev:「エクスポートボタンが40ページの文書で数分かかる」(2026-10-28)、@example_ops:「月末にエクスポートが行列するの、他にもいる?」(2026-10-29)
  2. より安い代替が推薦されている — Example Rival は、より安い価格を求めるスレッドに現れる

競合

Example Rival は、より安い代替を求められたときに推薦されている。推薦は機能ではなく価格について。

リスク

エクスポートの不満はサポート周辺のスレッドにも現れており、解約の会話に届く可能性がある。

次に

  • 今すぐ返信: 2026-10-28 のエクスポートスレッド。
  • 監視: 不満が API 利用者層に広がるか。
  • 製品へ共有: 月末のエクスポート遅延。

出典

  • https://x.com/example_dev/status/... — 2026-10-28
  • https://example.com/export-thread — 2026-10-29

実際の呼び出し

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

実際の API 呼び出しを表示
  1. 直近1週間の投稿を検索する

    X Search でブランド名と競合名を検索し、直近7日に限定し、アカウントと日付を残します。

    listening.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 XData = {
      data: {
        tweets: {
          content: string;
          author: { username: string };
          created_at: string;
          metrics: { retweet_count: number; favorite_count: number; reply_count: number };
          url: string;
        }[];
      };
    };
    
    const since = Math.floor((Date.now() - 7 * 24 * 60 * 60 * 1000) / 1000);
    
    const search = await felo<XData>("/v2/x/tweet/search", {
      query: '"Acme" OR "Acme app"',
      limit: 50,
      since_time: since,
    });
    
    const posts = search.data.tweets;

    出力例

    { "data": { "tweets": [
      {
        "content": "The export flow is slow again.",
        "author": { "username": "example_dev" },
        "created_at": "2026-10-28T09:14:00Z",
        "metrics": { "retweet_count": 4, "favorite_count": 21, "reply_count": 6 },
        "url": "https://x.com/example_dev/status/..."
      }
    ] } }
  2. 出典付きの Web 背景を加える

    Chat で議論の背景を聞き、出典付きの Web ページ一覧を取得します。

    listening.ts
    type ChatData = {
      data: {
        answer: string;
        resources: { link: string; title: string; snippet: string }[];
      };
    };
    
    const context = await felo<ChatData>("/v2/chat", {
      query: "Recent customer complaints and competitor mentions around Acme",
    });
    
    const sources = context.data.resources.slice(0, 5);

    出力例

    {
      "answer": "The main threads are …",
      "sources": [
        { "link": "https://example.com/thread", "title": "…", "snippet": "…" }
      ]
    }
  3. 背景ページを読む

    Web Fetch で最も関連する2〜3ページを読み、事実背景とリンクを補います。

    listening.ts
    type ExtractData = { data: { content: string } };
    
    const pages = await Promise.all(
      sources.slice(0, 3).map((source) =>
        felo<ExtractData>("/v2/web/extract", {
          url: source.link,
          output_format: "markdown",
          with_readability: true,
          with_cache: true,
        }).then((page) => ({ ...source, content: page.data.content })),
      ),
    );

    出力例

    // pages[0].content
    "# Example thread summary\n\nExtracted page content…"
  4. テーマ別に週報を書く

    テーマ、代表投稿、背景、リスク、翌週の注目点で Markdown を構成します。

    listening.ts
    const date = new Date().toISOString().slice(0, 10);
    
    const ranked = [...posts].sort(
      (a, b) => b.metrics.favorite_count - a.metrics.favorite_count,
    );
    
    const brief = [
      `# Social listening brief — ${date}`,
      "",
      "## What the web says",
      context.data.answer,
      "",
      "## What people are posting",
      ...ranked.slice(0, 10).map(
        (post) =>
          `- @${post.author.username} (${post.created_at.slice(0, 10)}): ${post.content}\n  ${post.url}`,
      ),
      "",
      "## Pages behind the answer",
      ...pages.map((page) => `- [${page.title}](${page.link})`),
      "",
      "## Sources",
      ...sources.map((source) => `- [${source.title}](${source.link})`),
    ].join("\n");
    
    console.log(brief);
  5. アーカイブして前週と比較する

    週報と出典を LiveDoc に保存し、翌週は前号を検索して比較します。

    listening.ts
    type LiveDocData = { data: { short_id: string } };
    
    const archive = await felo<LiveDocData>("/v2/livedocs", {
      name: "Social listening archive",
      description: "One document resource per weekly brief",
    });
    
    await felo(`/v2/livedocs/${archive.data.short_id}/resources/doc`, {
      title: `Social listening — ${date}`,
      content: brief,
    });
    
    type Retrieved = { data: { title: string; content: string; score: number }[] };
    
    const previous = await felo<Retrieved>(
      `/v2/livedocs/${archive.data.short_id}/resources/retrieve`,
      { query: "what changed since last week" },
    ).then((res) => res.data.filter((hit) => hit.score >= 0.7));

    出力例

    [
      { "title": "Social listening — 2026-10-23", "content": "…", "score": 0.88 }
    ]

含まれるもの

  • 直近1週間の日付付き X 投稿
  • 出典付きの Web 背景
  • テーマ別にまとめた議論の要約
  • そのまま共有できる週報
  • 各号を保存する LiveDoc

やらないこと

  • X のカバレッジは不完全で、全ユーザーを代表しない
  • 感情分析の断定的な結論は出さない
  • 自動投稿や返信はしない
  • DM や非公開コミュニティのデータは含まない
  • 週1回実行。スケジュールは agent か cron が担当

よくある質問

ブリーフの出典には何が含まれますか?

各 X 投稿はリンク、アカウント、日付を保持します。Web 背景は Chat と Web Fetch の公開ページです。出典のない主張は書きません。

競合も同時に追えますか?

はい。ブランド名と競合名を一緒に検索し、週報で分けて表示します。

感情を測定しますか?

テーマと語調で整理しますが、編集判断として明示し、正確な感情比率は主張しません。

どこまで遡りますか?

既定は直近7日で週報向けです。長い期間が必要なら `since_time` を変更します。

毎週自動で実行できますか?

はい。同じプロンプトを cron か agent のスケジュールに入れ、毎週同じ LiveDoc に書き込みます。

ブリーフ1本の費用は?

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

関連ワークフロー

自分の形に変える

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

1つの話題だけ

1つのリリースや論争に絞ると、ブリーフが焦点を絞れます。

YouTube の意見を加える

動画の文字起こしでクリエイターの視点を補いますが、個人の経験として明示します。

月次レポートにする

頻度を月1回に変え、ブランドや広報チーム向けにします。

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