作者:互联网 时间: 2026-07-30 19:30:01
Fathom 技能允许开发人员通过托管网关与 Fathom API 无缝交互。通过在 Openclaw Skills 生态系统中利用此集成,用户可以以编程方式检索会议录音、详细转录和简明摘要,而无需手动管理复杂的 OAuth 流程。对于需要集中会议情报并自动化会后工作流的团队,此技能充当了坚实的桥梁。
该技能旨在简化开发人员体验,它处理了身份验证的繁重工作,并为访问深度会议见解提供了一致的接口。无论您是构建内部工具还是将会议数据集成到更广泛的 AI 工作流中,Openclaw Skills 库中的这一新增功能都提供了必要的端点,将对话转化为可操作的数据。
下载入口:https://github.com/openclaw/skills/tree/main/skills/byungkyu/fathom-api
从源直接安装技能的最快方式。
npx clawhub@latest install fathom-api
将技能文件夹复制到以下位置之一
全局模式~/.openclaw/skills/
工作区
<project>/skills/
优先级:工作区 > 本地 > 内置
将此提示词复制到 OpenClaw 即可自动安装。
请帮我使用 Clawhub 安装 fathom-api。如果尚未安装 Clawhub,请先安装(npm i -g clawhub)。
要在您的 Openclaw Skills 环境中开始使用此技能,请按照以下步骤操作:
export MATON_API_KEY="YOUR_API_KEY"
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
该技能与多个核心数据对象进行交互。以下是 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
Access the Fathom API with managed OAuth authentication. Retrieve meeting recordings, transcripts, summaries, action items, and manage webhooks for notifications.
# 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
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.
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"
Manage your Fathom OAuth connections at https://ctrl.maton.ai.
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
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
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.
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
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.
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 namesNote: 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
}
]
}
]
}
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 /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"
}
]
}
GET /fathom/external/v1/teams
Query parameters:
cursor - Cursor for paginationExample:
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"
}
]
}
GET /fathom/external/v1/team_members
Query parameters:
cursor - Cursor for paginationteam - Team name to filter byExample:
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"
}
]
}
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 PlanAt 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 /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.
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
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();
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()
curl -g when URLs contain brackets (fields[], sort[], records[]) to disable glob parsingjq 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.| 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 |
MATON_API_KEY environment variable is set:echo $MATON_API_KEY
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
fathom. For example:https://gateway.maton.ai/fathom/external/v1/meetingshttps://gateway.maton.ai/external/v1/meetings