Felo API PlatformFelo API Platform

內容

用受眾真正在問的問題填滿一個月內容

用 Chat 梳理主題,找出受眾在 X 上問的問題,拉一條參考影片轉錄找真實角度,再寫一張四週內容日曆,每一列都標註證據。

建置時間25 分鐘難度進階更新於2026-10-30
適合誰內容負責人社群營運創作者

複製 prompt

把方括號裡的欄位替換掉,然後貼到 Claude Code、Codex 或任何能存取終端機的 AI。它會安裝 Felo skill、在花額度前詢問,並執行這套工作流程。

為[受眾]規劃四週關於[主題]的內容。

頻道:[頻道]。允許的形式:[形式清單]。發布日:[星期幾]。語言:[語言]。
參考影片(選填):[YouTube URL 或影片 ID]。受眾問題時間範圍:過去 [90] 天。

輸出一個 Markdown 日曆表,每個想法一列:
| 日期 | 形式 | 工作標題 | 角度 | 證據 |
- 日期:接下來四週內,使用允許的發布日。
- 形式:允許的形式之一。
- 工作標題:這篇內容叫什麼。
- 角度:用一句話說明它對受眾的承諾。
- 證據:支撐這個想法的提問、貼文、頁面或影片時間戳。

表格之後補充:
1. 這個月依托的三個主題。
2. 哪些想法來自受眾提問,哪些來自參考影片,哪些是你自己的假設。
3. 寫每篇內容前還需要研究什麼。
4. 附連結和日期的來源清單。

規則:
- 這些是想法,不是保證。不要承諾觸及、點擊、排名或成長。
- 不要編造趨勢、搜尋量、互動數據或引文。
- 每個受眾問題都要對應到附日期的貼文或頁面。證據不足時,把想法標示為假設。
- 參考影片只用於它實際涵蓋的角度;簡短引用並附時間戳。
- 消耗額度前,先展示預計執行的搜尋和擷取並等待我批准。
- 不要排程貼文、在 CMS 建立草稿或發布任何內容。
- 將結果寫入 ./content-calendar.md,並在對話中總結。

複製的內容也包含安裝步驟和安全規則。

你會得到什麼

一次執行的範例輸出,不是即時生成。

日曆範例(節錄)

內容日曆 — 範例月份

主題

  1. 清潔時間是隱性成本。
  2. 檯面空間決定購買。
  3. 自用購買 vs 送禮購買。

日曆

日期形式工作標題角度證據
2026-11-02輪播5 分鐘清潔測試展示沒人拍的清潔步驟@example_home,2026-10-24
2026-11-04短影音測量檯面空間在真實檯面上比較占地參考影片 — 42 秒
2026-11-09電子報密封圈為什麼會壞解釋買家反覆回報的故障模式@example_buyer,2026-10-19

想法來自哪裡

兩列來自帶日期的受眾提問,一列來自參考影片;如果是假設列,會明確標示。

先研究什麼

退貨率與密封圈更換政策——上面的來源都沒有涵蓋。

來源

  • 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. 排四週日曆

    依日期、形式、工作標題、角度和證據排成 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 上帶日期的受眾問題
  • 一條參考影片的轉錄和角度
  • 依四週排好的內容日曆
  • 保存計畫和來源的 LiveDoc

不做什麼

  • 不預測表現,也不保證流量
  • 不讀取你的歷史 analytics
  • 不自動寫完整貼文或發佈
  • 沒有參考影片時可以跳過該步驟
  • 日曆是建議,不是承諾

常見問題

日曆裡的選題從哪來?

來自 Chat 的主題地圖、X 上受眾真實提問,以及一條參考影片的角度。每條都保留證據連結或日期。

它知道過去什麼內容表現好嗎?

不知道。它不讀取你的 analytics;歷史表現需要你自己補進去。

會順便把貼文寫好嗎?

不會。它產出日曆和角度,寫作仍由你或寫作 agent 完成。

沒有參考影片怎麼辦?

跳過該步驟即可,主題和 X 問題仍然可以支撐日曆。

可以自動排程嗎?

不可以。它只產生計畫檔案,發佈排程需要你自己的工具。

一次規劃要花多少?

Chat、X 搜尋和影片轉錄按用量計費;目前費率在價格頁面,prompt 會先請求確認。

相關工作流程

改成你的版本

同一套配方,依你實際的交付方式調整。

只排兩週

把四週壓縮成兩週,適合剛開始穩定產出的團隊。

依通路拆分

為 newsletter、X 和 YouTube 各排一列,同一主題不同形式。

加入產品發佈節點

把發佈日和活動日作為固定列,再圍繞它們填內容。

這套配方背後的參考頁面,以及下一步可以看什麼。