Felo API PlatformFelo API Platform

コンテンツ

読者が実際に聞いている質問で1か月分のコンテンツを埋める

Chat でテーマを整理し、読者が X で聞いている質問を見つけ、参考動画の文字起こしからリアルな切り口を取り、すべての行に根拠を書いた4週間のコンテンツカレンダーを作ります。

所要時間25 分レベル中級更新日2026-10-30
対象コンテンツ責任者SNS運用クリエイター

プロンプトをコピー

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

[トピック] について、[読者] 向けの4週間分のコンテンツを計画してください。

チャネル: [チャネル]。許可する形式: [形式一覧]。投稿曜日: [曜日]。言語: [言語]。
参考動画(任意): [YouTube URL または動画 ID]。読者の質問の期間: 過去 [90] 日。

Markdown のカレンダー表を、アイデア1件につき1行で作成してください。
| 日付 | 形式 | 作業タイトル | 切り口 | 根拠 |
- 日付: 許可された投稿曜日を使い、次の4週間で。
- 形式: 許可された形式のいずれか。
- 作業タイトル: 記事の仮タイトル。
- 切り口: 読者への約束を1文で。
- 根拠: そのアイデアを正当化する質問、投稿、ページ、動画のタイムスタンプ。

表の後に以下を追加してください。
1. その月を支える3つのテーマ。
2. どのアイデアが読者の質問から来たか、どれが参考動画からか、どれがあなた自身の仮説か。
3. 各記事を書く前に追加調査が必要なこと。
4. リンクと日付付きの出典一覧。

ルール:
- これらはアイデアであり、保証ではありません。リーチ、クリック、順位、成長を約束しないでください。
- トレンド、検索ボリューム、エンゲージメント数、引用を捏造しないでください。
- 読者の質問はすべて日付付きの投稿またはページに紐づけてください。根拠が薄い場合は、そのアイデアを仮説としてラベル付けしてください。
- 参考動画は実際に扱っている切り口にだけ使い、短く引用してタイムスタンプを付けてください。
- クレジットを消費する前に、実行予定の検索と抽出を示して私の承認を待ってください。
- 投稿の予約、CMS での下書き作成、公開はしないでください。
- 結果を ./content-calendar.md に書き、チャットで要約してください。

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

完成するもの

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

カレンダーの例(抜粋)

コンテンツカレンダー — 例の月

テーマ

  1. 掃除の時間は隠れたコスト。
  2. カウンタースペースが購入を決める。
  3. 自分用と贈り物用の購入。

カレンダー

日付形式作業タイトル切り口根拠
2026-11-02カルーセル5分掃除テスト誰も撮らない掃除の工程を見せる@example_home, 2026-10-24
2026-11-04ショート動画カウンタースペースを測る実在のカウンターで設置面積を比較参考動画 — 42秒
2026-11-09ニュースレターなぜシールが壊れるか買い手が報告し続ける故障モードを説明@example_buyer, 2026-10-19

アイデアの出どころ

2行は日付付きの読者質問から、1行は参考動画から。仮説の行ならそのようにラベルを付ける。

最初に調べること

返品率とシール交換ポリシー — どちらも上の出典では扱っていない。

出典

  • https://example.com/category-guide — 2026-10-12
  • https://x.com/example_home/status/... — 2026-10-24

実際の呼び出し

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

実際の API 呼び出しを表示
  1. Chat でテーマを整理する

    このテーマで読者がよく気にするサブトピックを Chat に聞き、出典を残します。

    calendar.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 topic = "portable espresso makers";
    const audience = "home espresso beginners";
    
    const themes = await felo<ChatData>("/v2/chat", {
      query: `Themes, recurring questions, and content gaps around ${topic} for ${audience}`,
    });
    
    const sources = themes.data.resources.slice(0, 5);

    出力例

    {
      "answer": "Beginners ask about cleanup, counter space, and grind size …",
      "sources": [
        { "link": "https://example.com/guide", "title": "…", "snippet": "…" }
      ]
    }
  2. X で読者の質問を探す

    テーマに関する質問を X で検索し、直近90日に限定し、アカウントと日付を残します。

    calendar.ts
    type XData = {
      data: {
        tweets: {
          content: string;
          author: { username: string };
          created_at: string;
          url: string;
        }[];
      };
    };
    
    const since = Math.floor((Date.now() - 90 * 24 * 60 * 60 * 1000) / 1000);
    
    const questions = await felo<XData>("/v2/x/tweet/search", {
      query: `"${topic}" (recommend OR beginner OR how)`,
      limit: 50,
      since_time: since,
    });
    
    const asked = questions.data.tweets;

    出力例

    { "data": { "tweets": [
      {
        "content": "How do you clean one of these without taking it apart?",
        "author": { "username": "example_home" },
        "created_at": "2026-10-24T11:30:00Z",
        "url": "https://x.com/example_home/status/..."
      }
    ] } }
  3. 参考動画の文字起こしを取る

    YouTube Subtitling で関連動画の文字起こしを取得し、再利用できるリアルな切り口を探します。

    calendar.ts
    type SubtitleData = {
      data: {
        title: string;
        contents: { text: string; start: number; duration: number }[];
      };
    };
    
    const videoCode = "dQw4w9WgXcQ"; // replace with your reference video id
    
    const video = await felo<SubtitleData>(
      `/v2/youtube/subtitling?video_code=${videoCode}&language=en&with_time=true`,
    );

    出力例

    {
      "title": "Example Video Title",
      "contents": [
        { "text": "Subtitle text", "start": 42.3, "duration": 8.1 }
      ]
    }
  4. 4週間のカレンダーを組む

    日付、形式、作業タイトル、切り口、根拠を Markdown 表にします。

    calendar.ts
    const start = new Date();
    const day = (offset: number) => {
      const date = new Date(start);
      date.setDate(date.getDate() + offset);
      return date.toISOString().slice(0, 10);
    };
    
    type Idea = {
      dayOffset: number;
      format: string;
      title: string;
      angle: string;
      evidence: string;
    };
    
    // Rows come from the themes, the dated questions, and the transcript.
    const anchor = video.data.contents[0];
    
    const ideas: Idea[] = [
      {
        dayOffset: 1,
        format: "carousel",
        title: "The 5-minute cleanup test",
        angle: "Show the cleanup step nobody films",
        evidence: asked[0]?.url ?? "hypothesis",
      },
      {
        dayOffset: 3,
        format: "short video",
        title: "Counter space, measured",
        angle: "Compare footprints on one real counter",
        evidence: anchor
          ? `${video.data.title} — ${Math.round(anchor.start)}s`
          : video.data.title,
      },
    ];
    
    const calendar = [
      "| Date | Format | Working title | Angle | Evidence |",
      "| --- | --- | --- | --- | --- |",
      ...ideas.map(
        (idea) =>
          `| ${day(idea.dayOffset)} | ${idea.format} | ${idea.title} | ${idea.angle} | ${idea.evidence} |`,
      ),
    ].join("\n");
    
    console.log(calendar);

    出力例

    | Date | Format | Working title | Angle | Evidence |
    | --- | --- | --- | --- | --- |
    | 2026-11-02 | carousel | The 5-minute cleanup test | Show the cleanup step nobody films | https://x.com/example_home/status/... |
    | 2026-11-04 | short video | Counter space, measured | Compare footprints on one real counter | Example Video Title — 42s |
  5. LiveDoc に保存する

    カレンダーと出典を LiveDoc に保存し、月末の振り返りで検索できるようにします。

    calendar.ts
    type LiveDocData = { data: { short_id: string } };
    
    const plan = await felo<LiveDocData>("/v2/livedocs", {
      name: `Content calendar: ${topic}`,
      description: "Monthly plan with themes, calendar rows, and evidence",
    });
    
    await felo(`/v2/livedocs/${plan.data.short_id}/resources/urls`, {
      urls: sources.map((source) => ({ url: source.link, title: source.title })),
    });
    
    await felo(`/v2/livedocs/${plan.data.short_id}/resources/doc`, {
      title: `Content calendar — ${day(0).slice(0, 7)}`,
      content: calendar,
    });
    
    type Retrieved = { data: { title: string; content: string; score: number }[] };
    
    const lastMonth = await felo<Retrieved>(
      `/v2/livedocs/${plan.data.short_id}/resources/retrieve`,
      { query: "what did we plan last month" },
    ).then((res) => res.data.filter((hit) => hit.score >= 0.7));

    出力例

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

含まれるもの

  • Chat のテーママップ
  • 日付付きの X 読者質問
  • 参考動画の文字起こしと切り口
  • 4週間分のコンテンツカレンダー
  • 計画と出典を保存する LiveDoc

やらないこと

  • 成果やトラフィックは保証しない
  • 過去の analytics は読まない
  • 投稿文の自動執筆や公開はしない
  • 参考動画がない場合はそのステップを省略できる
  • カレンダーは提案であり約束ではない

よくある質問

カレンダーのアイデアはどこから?

Chat のテーママップ、X の読者の実際の質問、参考動画の切り口から来ます。各項目は根拠リンクか日付を保持します。

過去に何が伸びたか分かりますか?

分かりません。analytics は読まないため、過去実績は自分で補ってください。

投稿文も書きますか?

いいえ。カレンダーと切り口を出力し、執筆はあなたか執筆 agent が行います。

参考動画がない場合は?

そのステップを省略してください。テーマと X の質問だけでカレンダーを支えられます。

自動で予約投稿できますか?

いいえ。計画ファイルを生成するだけで、投稿予約は自分のツールで行います。

1回の計画費用は?

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

関連ワークフロー

自分の形に変える

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

2週間だけ組む

4週間を2週間に圧縮し、発信を始めたばかりのチーム向けにします。

チャネル別に分ける

ニュースレター、X、YouTube を列に分け、同じテーマを異なる形式にします。

製品リリースを入れる

リリース日とイベント日を固定行にし、その周りにコンテンツを埋めます。

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