Fathom:AI 会议转录与摘要 - Openclaw Skills
什么是 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,在处理新录音时自动通知团队频道。
- 用户使用 Maton API 密钥进行身份验证以访问网关服务。
- 通过托管的 OAuth 流程建立连接,可在 Maton 控制 URL 进行管理。
- 请求发送至网关 URL,该网关会自动为特定连接注入所需的 OAuth 令牌。
- 网关将请求代理至原生 Fathom API 端点,以检索录音、转录或团队数据。
- 请求的数据返回给用户,如果是异步请求,则发送至指定的毁掉 URL。
Fathom 会议情报 配置指南
要在您的 Openclaw Skills 环境中开始使用此技能,请按照以下步骤操作:
- 从 maton.ai 设置仪表板获取 Maton API 密钥。
- 将密钥导出到您的环境变量:
export MATON_API_KEY="YOUR_API_KEY"
- 通过控制 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
- 在浏览器中打开返回的 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
- Sign in or create an account at maton.ai
- Go to maton.ai/settings
- 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 paginationcreated_after- Filter to meetings created after this timestamp (e.g.,2025-01-01T00:00:00Z)created_before- Filter to meetings created before this timestampcalendar_invitees_domains[]- Filter by company domains (pass once per value)calendar_invitees_domains_type- Filter by invitee type:all,only_internal,one_or_more_externalrecorded_by[]- Filter by email addresses of users who recorded meetingsteams[]- 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 paginationteam- 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 usersmy_shared_with_team_recordings- (Team Plans) Recordings you've shared with teamsshared_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 -gwhen URLs contain brackets (fields[],sort[],records[]) to disable glob parsing - IMPORTANT: When piping curl output to
jqor other commands, environment variables like$MATON_API_KEYmay 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
- Check that the
MATON_API_KEYenvironment variable is set:
echo $MATON_API_KEY
- 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
- 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
-
07.30
GLM-5.2-NVFP4 项目介绍:GitCode 开源模型信息整理
-
07.30
境界刀鸣死神战技是什么
-
07.30
伊莫星魔师角色怎么样
-
07.30
天天跳绳如何加入小队
-
07.30
晴空双子神器如何使用
-
07.30
金铲铲大数据在哪查询
-
- 使命召唤黑色行动7适者生存成就如何解锁
- 07.30
-
- 天天跳绳如何查看身体数据
- 07.30
-
- 名将杀游戏中有哪些玩法
- 07.30
-
- 斗罗大陆零邪月角色强度如何
- 07.30
-
- igxe如何绑定steam手机令牌
- 07.30
-
- 燕云十六声沧浪剑诀心法如何获取
- 07.30
-
-
下载
- |
-
-
下载
- 《行尸走肉第一章》免安装中文汉化硬盘版下载
- 单机|436 MB
- 一款以动作冒险为主题的游戏
-
-
下载
- 《街头霸王X铁拳》免安装中文汉化硬盘版下载
- 单机|111MB
- 一款非常好玩的格斗游戏
-
-
下载
- |
-
-
下载
- 《暗黑破坏神3》免安装繁体中文正式版下载
- 单机|7630 MB
- 一款以角色扮演为主题的游戏
-
-
下载
- 《马克思佩恩3》免安装硬盘版下载
- 单机|27033 MB
- 一款以第三人称射击为主题的游戏