详情

首页手游攻略 Fathom:AI 会议转录与摘要 - Openclaw Skills

Fathom:AI 会议转录与摘要 - Openclaw Skills

佚名 2026-07-30 19:30:01

什么是 Fathom 会议情报?

Fathom 技能允许开发人员通过托管网关与 Fathom API 无缝交互。通过在 Openclaw Skills 生态系统中利用此集成,用户可以以编程方式检索会议录音、详细转录和简明摘要,而无需手动管理复杂的 OAuth 流程。对于需要集中会议情报并自动化会后工作流的团队,此技能充当了坚实的桥梁。

该技能旨在简化开发人员体验,它处理了身份验证的繁重工作,并为访问深度会议见解提供了一致的接口。无论您是构建内部工具还是将会议数据集成到更广泛的 AI 工作流中,Openclaw Skills 库中的这一新增功能都提供了必要的端点,将对话转化为可操作的数据。

下载入口:https://github.com/openclaw/skills/tree/main/skills/byungkyu/fathom-api

安装与下载

1. ClawHub CLI

从源直接安装技能的最快方式。

npx clawhub@latest install fathom-api

2. 手动安装

将技能文件夹复制到以下位置之一

全局模式 ~/.openclaw/skills/ 工作区 <project>/skills/

优先级:工作区 > 本地 > 内置

3. 提示词安装

将此提示词复制到 OpenClaw 即可自动安装。

请帮我使用 Clawhub 安装 fathom-api。如果尚未安装 Clawhub,请先安装(npm i -g clawhub)。

Fathom 会议情报 应用场景

  • 将会议摘要同步到中央知识库或项目管理工具。
  • 根据 Fathom 会议转录中发现的特定关键词触发自动跟进邮件。
  • 在过去会议库中搜索特定的行动项或技术决策。
  • 设置 Webhook,在处理新录音时自动通知团队频道。
Fathom 会议情报 工作原理
  1. 用户使用 Maton API 密钥进行身份验证以访问网关服务。
  2. 通过托管的 OAuth 流程建立连接,可在 Maton 控制 URL 进行管理。
  3. 请求发送至网关 URL,该网关会自动为特定连接注入所需的 OAuth 令牌。
  4. 网关将请求代理至原生 Fathom API 端点,以检索录音、转录或团队数据。
  5. 请求的数据返回给用户,如果是异步请求,则发送至指定的毁掉 URL。

Fathom 会议情报 配置指南

要在您的 Openclaw Skills 环境中开始使用此技能,请按照以下步骤操作:

  1. 从 maton.ai 设置仪表板获取 Maton API 密钥。
  2. 将密钥导出到您的环境变量:
export MATON_API_KEY="YOUR_API_KEY"
  1. 通过控制 API 创建 Fathom 连接:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'fathom'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
  1. 在浏览器中打开返回的 URL 以授权 Fathom 访问。

Fathom 会议情报 数据架构与分类体系

该技能与多个核心数据对象进行交互。以下是 Openclaw Skills 集成组织信息的方式:

对象 描述 关键字段
Meeting (会议) 录制会话的元数据 recording_id, meeting_title, created_at, url
Transcript (转录) 对话的完整文本 speaker (display_name), text, timestamp
Summary (摘要) AI 生成的会议概览 template_name, markdown_formatted
Team (团队) 组织结构数据 name, created_at
Webhook 事件通知配置 destination_url, triggered_for, secret
name: fathom
description: |
  Fathom API integration with managed OAuth. Access meeting recordings, transcripts, summaries, and manage webhooks. Use this skill when users want to retrieve meeting content, search recordings, or set up webhook notifications for new meetings. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
compatibility: Requires network access and valid Maton API key
metadata:
  author: maton
  version: "1.0"
  clawdbot:
    emoji: ??
    homepage: "https://maton.ai"
    requires:
      env:
        - MATON_API_KEY

Fathom

Access the Fathom API with managed OAuth authentication. Retrieve meeting recordings, transcripts, summaries, action items, and manage webhooks for notifications.

Quick Start

# List recent meetings
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/fathom/external/v1/meetings')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Base URL

https://gateway.maton.ai/fathom/{native-api-path}

Replace {native-api-path} with the actual Fathom API endpoint path. The gateway proxies requests to api.fathom.ai and automatically injects your OAuth token.

Authentication

All requests require the Maton API key in the Authorization header:

Authorization: Bearer $MATON_API_KEY

Environment Variable: Set your API key as MATON_API_KEY:

export MATON_API_KEY="YOUR_API_KEY"

Getting Your API Key

  1. Sign in or create an account at maton.ai
  2. Go to maton.ai/settings
  3. Copy your API key

Connection Management

Manage your Fathom OAuth connections at https://ctrl.maton.ai.

List Connections

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=fathom&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Create Connection

python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'fathom'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Get Connection

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Response:

{
  "connection": {
    "connection_id": "21fd90f9-5935-43cd-b6c8-bde9d915ca80",
    "status": "ACTIVE",
    "creation_time": "2025-12-08T07:20:53.488460Z",
    "last_updated_time": "2026-01-31T20:03:32.593153Z",
    "url": "https://connect.maton.ai/?session_token=...",
    "app": "fathom",
    "metadata": {}
  }
}

Open the returned url in a browser to complete OAuth authorization.

Delete Connection

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Specifying Connection

If you have multiple Fathom connections, specify which one to use with the Maton-Connection header:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/fathom/external/v1/meetings')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '21fd90f9-5935-43cd-b6c8-bde9d915ca80')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

If omitted, the gateway uses the default (oldest) active connection.

API Reference

Meetings

List Meetings

GET /fathom/external/v1/meetings

Query parameters:

  • cursor - Cursor for pagination
  • created_after - Filter to meetings created after this timestamp (e.g., 2025-01-01T00:00:00Z)
  • created_before - Filter to meetings created before this timestamp
  • calendar_invitees_domains[] - Filter by company domains (pass once per value)
  • calendar_invitees_domains_type - Filter by invitee type: all, only_internal, one_or_more_external
  • recorded_by[] - Filter by email addresses of users who recorded meetings
  • teams[] - Filter by team names

Note: OAuth users cannot use include_transcript, include_summary, include_action_items, or include_crm_matches parameters on this endpoint. Use the /recordings/{recording_id}/summary and /recordings/{recording_id}/transcript endpoints instead.

Example with filters:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/fathom/external/v1/meetings?created_after=2025-01-01T00:00:00Z&teams[]=Sales')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Response:

{
  "limit": 10,
  "next_cursor": "eyJwYWdlX251bSI6Mn0=",
  "items": [
    {
      "title": "Quarterly Business Review",
      "meeting_title": "QBR 2025 Q1",
      "recording_id": 123456789,
      "url": "https://fathom.video/xyz123",
      "share_url": "https://fathom.video/share/xyz123",
      "created_at": "2025-03-01T17:01:30Z",
      "scheduled_start_time": "2025-03-01T16:00:00Z",
      "scheduled_end_time": "2025-03-01T17:00:00Z",
      "recording_start_time": "2025-03-01T16:01:12Z",
      "recording_end_time": "2025-03-01T17:00:55Z",
      "calendar_invitees_domains_type": "one_or_more_external",
      "transcript_language": "en",
      "transcript": null,
      "default_summary": null,
      "action_items": null,
      "crm_matches": null,
      "recorded_by": {
        "name": "Alice Johnson",
        "email": "[email protected]",
        "email_domain": "acme.com",
        "team": "Marketing"
      },
      "calendar_invitees": [
        {
          "name": "Alice Johnson",
          "email": "[email protected]",
          "email_domain": "acme.com",
          "is_external": false,
          "matched_speaker_display_name": null
        }
      ]
    }
  ]
}

Recordings

Get Summary

GET /fathom/external/v1/recordings/{recording_id}/summary

Query parameters:

  • destination_url - Optional URL for async callback. If provided, the summary will be POSTed to this URL.

Synchronous example:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/fathom/external/v1/recordings/123456789/summary')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Response:

{
  "summary": {
    "template_name": "general",
    "markdown_formatted": "## Summary

We reviewed Q1 OKRs, identified budget risks, and agreed to revisit projections next month."
  }
}

Async example:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/fathom/external/v1/recordings/123456789/summary?destination_url=https://example.com/webhook')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Get Transcript

GET /fathom/external/v1/recordings/{recording_id}/transcript

Query parameters:

  • destination_url - Optional URL for async callback. If provided, the transcript will be POSTed to this URL.

Synchronous example:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/fathom/external/v1/recordings/123456789/transcript')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Response:

{
  "transcript": [
    {
      "speaker": {
        "display_name": "Alice Johnson",
        "matched_calendar_invitee_email": "[email protected]"
      },
      "text": "Let's revisit the budget allocations.",
      "timestamp": "00:05:32"
    }
  ]
}

Teams

List Teams

GET /fathom/external/v1/teams

Query parameters:

  • cursor - Cursor for pagination

Example:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/fathom/external/v1/teams')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Response:

{
  "limit": 25,
  "next_cursor": null,
  "items": [
    {
      "name": "Sales",
      "created_at": "2023-11-10T12:00:00Z"
    }
  ]
}

Team Members

List Team Members

GET /fathom/external/v1/team_members

Query parameters:

  • cursor - Cursor for pagination
  • team - Team name to filter by

Example:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/fathom/external/v1/team_members?team=Sales')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Response:

{
  "limit": 25,
  "next_cursor": null,
  "items": [
    {
      "name": "Bob Lee",
      "email": "[email protected]",
      "created_at": "2024-06-01T08:30:00Z"
    }
  ]
}

Webhooks

Create Webhook

POST /fathom/external/v1/webhooks
Content-Type: application/json

{
  "destination_url": "https://example.com/webhook",
  "triggered_for": ["my_recordings", "my_shared_with_team_recordings"],
  "include_transcript": true,
  "include_summary": true,
  "include_action_items": true,
  "include_crm_matches": false
}

triggered_for options:

  • my_recordings - Your private recordings (excludes those shared with teams on Team Plans)
  • shared_external_recordings - Recordings shared with you by other users
  • my_shared_with_team_recordings - (Team Plans) Recordings you've shared with teams
  • shared_team_recordings - (Team Plans) Recordings from other users on your Team Plan

At least one of include_transcript, include_summary, include_action_items, or include_crm_matches must be true.

Example:

python <<'EOF'
import urllib.request, os, json
data = json.dumps({'destination_url': 'https://example.com/webhook', 'triggered_for': ['my_recordings'], 'include_summary': True}).encode()
req = urllib.request.Request('https://gateway.maton.ai/fathom/external/v1/webhooks', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Response:

{
  "id": "ikEoQ4bVoq4JYUmc",
  "url": "https://example.com/webhook",
  "secret": "whsec_x6EV6NIAAz3ldclszNJTwrow",
  "created_at": "2025-06-30T10:40:46Z",
  "include_transcript": false,
  "include_crm_matches": false,
  "include_summary": true,
  "include_action_items": false,
  "triggered_for": ["my_recordings"]
}

Delete Webhook

DELETE /fathom/external/v1/webhooks/{id}

Example:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/fathom/external/v1/webhooks/ikEoQ4bVoq4JYUmc', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Returns 204 No Content on success.

Pagination

Use cursor for pagination. Response includes next_cursor when more results exist:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/fathom/external/v1/meetings?cursor=eyJwYWdlX251bSI6Mn0=')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Code Examples

JavaScript

const response = await fetch(
  'https://gateway.maton.ai/fathom/external/v1/meetings?created_after=2025-01-01T00:00:00Z',
  {
    headers: {
      'Authorization': `Bearer ${process.env.MATON_API_KEY}`
    }
  }
);
const data = await response.json();

Python

import os
import requests

response = requests.get(
    'https://gateway.maton.ai/fathom/external/v1/meetings',
    headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
    params={'created_after': '2025-01-01T00:00:00Z'}
)
data = response.json()

Notes

  • Recording IDs are integers
  • Timestamps are in ISO 8601 format
  • Transcripts and summaries are in English
  • Webhook secrets are used to verify webhook signatures
  • CRM matches only return data from your or your team's linked CRM
  • IMPORTANT: When using curl commands, use curl -g when URLs contain brackets (fields[], sort[], records[]) to disable glob parsing
  • IMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments. You may get "Invalid API key" errors when piping.

Error Handling

Status Meaning
400 Bad request or missing Fathom connection
401 Invalid or missing Maton API key
404 Resource not found
429 Rate limited
4xx/5xx Passthrough error from Fathom API

Troubleshooting: API Key Issues

  1. Check that the MATON_API_KEY environment variable is set:
echo $MATON_API_KEY
  1. Verify the API key is valid by listing connections:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Troubleshooting: Invalid App Name

  1. Ensure your URL path starts with fathom. For example:
  • Correct: https://gateway.maton.ai/fathom/external/v1/meetings
  • Incorrect: https://gateway.maton.ai/external/v1/meetings

Resources

点击查看更多
推荐专题
热门阅读