Felo API PlatformFelo API Platform

研究

第一次外聯之前研究一個目標客戶

讀目標公司自己的網站、近期報導和公開動態,再寫一份客戶簡報:最近動作、可能的優先順序、開場話題,以及誠實的未知項。

建置時間20 分鐘難度入門更新於2026-10-30
適合誰創辦人與營運者客戶經理業務負責人

複製 prompt

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

在[外聯 / 需求訪談 / 續約]之前,為[公司名稱或網域]製作一份客戶簡報。

我們的產品:[產品或服務]。我們關注的買家:[角色]。近期動態時間範圍:[過去 90 天 / 過去 12 個月]。

閱讀他們自己的網站、公開報導和公開貼文。輸出一份 Markdown 簡報,包含:
1. 他們做什麼,一段話,附來源。
2. 近期動態:發布、募資、招聘、管理層、合作——附日期和連結。
3. 本季可能的優先事項,明確標示為推論。
4. 開場話題:三個具體觀察,每個都附來源。
5. 未知項:你無法從公開來源核實的內容。
6. 完整來源清單。

規則:
- 不要編造聯絡人姓名、電子郵件、電話、員工人數、營收或募資額。
- 只用公開來源:不要私人資料、不要僅登入可見的頁面、不要爬取的目錄。
- 不要寫入 CRM 或任何其他系統。簡報是供人審閱的檔案。
- 每個推論都標示為推論;事實保留連結和日期。
- 不要把買家的意圖寫成事實。
- 消耗額度前,先展示預計執行的 API 呼叫並等待我批准。
- 不要傳送、排程、發布或傳訊息給任何人。
- 將結果寫入 ./account-brief.md,並在對話中總結。

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

你會得到什麼

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

客戶簡報範例(節錄)

客戶簡報 — [公司],2026-10-30 核對

他們做什麼

為中型物流商製造倉庫揀選機器人。來源:https://example.com/about(2026-10-30 核對)。

近期動態

  • 開設第二個組裝基地 — https://example.com/news/expansion(2026-10-24)
  • 招聘「部署營運」團隊 — https://example.com/careers(2026-10-30 核對)
  • 其帳號關於合作夥伴整合的貼文 — @example_company(2026-10-21)

可能的優先事項(推論)

在更多站點更快部署。來自擴張貼文與新部署職位的推論——不是已聲明的計畫,也未在公開管道確認。

開場話題

  • 第二個基地是新的:問站點不同時部署手冊會怎麼變。來源:https://example.com/news/expansion
  • 專職部署營運職位暗示業務與安裝之間的交接。來源:https://example.com/careers

未知

  • 目前誰負責部署營運:公開來源暫無資料。
  • 車隊規模與合約金額:暫無資料。

來源

  • https://example.com/about
  • https://example.com/news/expansion
  • https://example.com/careers

實際呼叫

給開發者:同一套工作流程的可複製程式碼,依執行順序排列。

展開實際 API 呼叫
  1. 先拿公司概覽

    用 Chat 問公司做什麼、最近有什麼公開變化,保留它引用的來源。

    account.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 company = "Example Robotics";
    const domain = "example.com";
    const buyerRole = "Head of Operations";
    
    const overview = await felo<ChatData>("/v2/chat", {
      query: `What does ${company} do, who buys from it, and what changed in the last 90 days?`,
    });
    
    const seedSources = overview.data.resources.slice(0, 5);

    範例輸出

    {
      "answer": "The company builds …",
      "sources": [
        { "link": "https://example.com/about", "title": "…", "snippet": "…" }
      ]
    }
  2. 讀官網、定價和招聘

    用 Web Fetch 讀 About、定價和招聘頁,看清他們的產品、客戶和正在招的職位。

    account.ts
    type ExtractData = { data: { content: string } };
    
    const companyPages = [
      { url: `https://${domain}/about`, title: "About" },
      { url: `https://${domain}/pricing`, title: "Pricing" },
      { url: `https://${domain}/careers`, title: "Careers" },
    ];
    
    const pages = await Promise.all(
      companyPages.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/careers",
      "checkedAt": "2026-10-30",
      "content": "# Careers\n\nOpen roles: deployment operations…"
    }
  3. 看最近 90 天的公開動態

    在 X 搜公司名和產品名,保留最近 90 天的公開貼文、帳號和日期。

    account.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 posts = await felo<XData>("/v2/x/tweet/search", {
      query: `"${company}" (hiring OR launch OR partnership OR expansion)`,
      limit: 20,
      since_time: since,
    });
    
    const recent = posts.data.tweets.slice(0, 5);

    範例輸出

    { "data": { "tweets": [
      {
        "content": "We just opened our second assembly site",
        "author": { "username": "example_company" },
        "created_at": "2026-10-21T14:02:00Z",
        "metrics": { "retweet_count": 4, "favorite_count": 31 }
      }
    ] } }
  4. 寫客戶簡報

    寫公司概覽、最近動作、可能優先順序、開場話題、未知項和來源。

    account.ts
    const today = new Date().toISOString().slice(0, 10);
    
    const accountBrief = [
      `# Account brief — ${company}`,
      `Checked ${today}. Buyer role: ${buyerRole}.`,
      "",
      "## What they do",
      overview.data.answer,
      "",
      "## Recent moves",
      ...recent.map(
        (post) => `- ${post.created_at.slice(0, 10)}: ${post.content} (from @${post.author.username})`,
      ),
      ...pages.map((page) => `- ${page.title} page captured ${page.checkedAt}: ${page.url}`),
      "",
      "## Likely priorities (inference)",
      "<!-- One or two sentences from the moves above. Mark them as inference, never a stated plan. Delete this comment when filled. -->",
      "",
      "## Conversation starters",
      ...recent.slice(0, 3).map(
        (post) => `- Ask about: ${post.content.slice(0, 100)} (dated ${post.created_at.slice(0, 10)})`,
      ),
      "",
      "## Unknowns",
      "- Who owns the workflow we sell into: Not available from public sources.",
      "- Contract values and team size: Not available.",
      "",
      "## Sources",
      ...pages.map((page) => `- ${page.title}: ${page.url}`),
      ...seedSources.map((source) => `- ${source.title}: ${source.link}`),
    ].join("\n");
    
    console.log(accountBrief);

    範例輸出

    # Account brief — Example Robotics
  5. 存進 LiveDoc

    把簡報和來源存進 LiveDoc,下一次跟進可以直接重複使用。

    account.ts
    type LiveDocData = { data: { short_id: string } };
    
    const accountDoc = await felo<LiveDocData>("/v2/livedocs", {
      name: `Account: ${company}`,
      description: `Briefs and sources checked ${today}`,
    });
    
    await felo(`/v2/livedocs/${accountDoc.data.short_id}/resources/urls`, {
      urls: [
        ...pages.map((page) => ({ url: page.url, title: page.title })),
        ...seedSources.map((source) => ({ url: source.link, title: source.title })),
      ],
    });
    
    await felo(`/v2/livedocs/${accountDoc.data.short_id}/resources/doc`, {
      title: `Account brief ${today}`,
      content: accountBrief,
    });
    
    console.log(accountDoc.data.short_id); // the next call reuses this LiveDoc

    範例輸出

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

包含什麼

  • 來自 Chat 的有來源公司概覽
  • 官網、定價頁和招聘頁的 Markdown 擷取
  • X 上帶日期的公開動態
  • 結構化客戶簡報
  • 保存證據的 LiveDoc

不做什麼

  • 不提供聯絡人電子郵件、電話或個人資料
  • 不讀私有資料或僅登入可見的頁面
  • 不寫 CRM,也不替你發訊息
  • 人數、營收、募資只在來源明確給出時記錄
  • 優先順序和意圖會明確標為推論

常見問題

它會給聯絡人電子郵件嗎?

不會。工作流程只做公開研究,不提供電子郵件、電話或個人資料。

資料來自哪裡?

Chat 回傳有來源的公司概覽,Web Fetch 讀官網、定價和招聘頁,X Search 補充公開動態。每條都保留連結和日期。

可以研究非科技公司嗎?

可以。公開資訊少的行業,簡報會明確標出未知項,而不是編造。

會寫進 CRM 嗎?

不會。它只產生 Markdown 簡報,CRM 寫入需要你自己的整合。

優先順序是事實嗎?

不是。簡報把「可能優先順序」標為推論,並給出依據;業務仍需自己判斷。

一次要花多少?

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

相關工作流程

改成你的版本

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

只研究一個細分

把範圍縮到某個行業或地區,簡報會更具體。

加入最近一次發佈會

把發佈會頁面作為額外來源,開場話題會更有時效性。

和競品拆解一起用

把客戶簡報裡的優先順序與競品拆解裡的定位對照,找到差異化切入點。

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