Felo API PlatformFelo API Platform

研究

第一次外联之前研究一个目标客户

读目标公司自己的网站、近期报道和公开动态,再写一份客户简报:最近动作、可能的优先级、开场话题,以及诚实的未知项。

构建时间20 分钟难度入门更新于2026-10-30
适合谁创始人与运营者客户经理销售负责人

复制 prompt

把方括号里的字段替换掉,然后粘贴到 Claude Code、Codex 或任何能访问终端的 AI。它会安装 Felo skill、在花额度前询问,并执行这套 workflow。

在[外联 / 需求挖掘电话 / 续约]之前,为[公司名称或域名]制作一份客户简报。

我们的产品:[产品或服务]。我们关注的买家:[角色]。近期动态时间范围:[过去 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

实际调用

给开发者:同一套 workflow 的可复制代码,按执行顺序排列。

展开实际 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,也不替你发消息
  • 人数、收入、融资只在来源明确给出时记录
  • 优先级和意图会明确标为推断

常见问题

它会给联系人邮箱吗?

不会。workflow 只做公开研究,不提供邮箱、电话或个人资料。

数据来自哪里?

Chat 返回有来源的公司概览,Web Fetch 读官网、定价和招聘页,X Search 补充公开动态。每条都保留链接和日期。

可以研究非科技公司吗?

可以。公开信息少的行业,简报会明确标出未知项,而不是编造。

会写进 CRM 吗?

不会。它只生成 Markdown 简报,CRM 写入需要你自己的集成。

优先级是事实吗?

不是。简报把“可能优先级”标为推断,并给出依据;销售仍需自己判断。

一次要花多少?

Chat、抽取和 X 搜索都按用量计费;当前费率在价格页面,prompt 会先请求确认。

相关 workflow

改成你的版本

同一套配方,按你实际的交付方式调整。

只研究一个细分

把范围缩到某个行业或地区,简报会更具体。

加入最近一次发布会

把发布会页面作为额外来源,开场话题会更有时效性。

和竞品拆解一起用

把客户简报里的优先级与竞品拆解里的定位对照,找到差异化切入点。

这套配方背后的参考页面,以及下一步可以看什么。