通过托管 OAuth 访问 Microsoft Graph Excel 接口,读写 OneDrive 中的工作簿、工作表、区域、表格与图表。
文档
Fathom
试用通过托管 OAuth 代理访问 Fathom API,获取会议录像、转写、摘要并管理 Webhook。
它能做什么
通过 Maton 托管的 OAuth 代理调用 Fathom API,可列出会议、获取录像摘要与转写、查询团队与成员,并创建或删除 Webhook。请求使用 `MATON_API_KEY` Bearer 令牌访问 `https://api.maton.ai/fathom/{path}`,分页采用 cursor 机制。所有写入操作(Webhook 创建/删除、OAuth 连接的新建/删除与切换)需事先与用户确认;OAuth 用户无法在会议列表接口直接获取转写、摘要、行动项或 CRM 匹配结果,需改用 `/recordings/{id}/summary` 与 `/recordings/{id}/transcript`,也支持通过 `destination_url` 异步回调。
什么时候用它
- 按日期范围、团队、录制人或参会方域名筛选近期会议
- 按 recording ID 拉取单场会议的摘要或完整转写(支持同步或异步回调)
- 注册 Webhook,在新会议产生时收到包含摘要或行动项的通知
- 枚举已连接 Fathom 工作区下的团队与团队成员
技能文档
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://api.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://api.maton.ai/fathom/{native-api-path}
Maton 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://api.maton.ai.
List Connections
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.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://api.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://api.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": "{connection_id}",
"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://api.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://api.maton.ai/fathom/external/v1/meetings')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections, always include this header to ensure requests go to the intended account.
Security & Permissions
- Access is scoped to meeting recordings, transcripts, summaries, and manage webhooks within the connected Fathom account.
- All write operations require explicit user approval. Before executing any create, update, or delete call, confirm the target resource and intended effect with the user.
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://api.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": "alice.johnson@acme.com",
"email_domain": "acme.com",
"team": "Marketing"
},
"calendar_invitees": [
{
"name": "Alice Johnson",
"email": "alice.johnson@acme.com",
"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://api.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\n\nWe 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://api.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://api.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": "alice.johnson@acme.com"
},
"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://api.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://api.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": "bob.lee@acme.com",
"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://api.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://api.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://api.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://api.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://api.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://api.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://api.maton.ai/fathom/external/v1/meetings - Incorrect:
https://api.maton.ai/external/v1/meetings
Resources
- Fathom API Documentation
- LLM Reference
- Maton Community
- Maton Support
相关技能
以 AI 机器人身份加入视频会议,提供语音、虚拟形象与屏幕共享四种模式。
在本地磁盘以分类纯 Markdown 文件保存需要长期留存的事实,与智能体内置记忆并存。
把自然语言描述转为结构化 JSON,并由 mcp-diagram-generator MCP 服务生成 Draw.io、Mermaid 或 Excalidraw 图表文件。
从 AdMapix API 拉取广告创意、应用、榜单和收入预估等数据,原样返回结构化 JSON。
按用户明确指令,在得到大脑(Get笔记)中保存、搜索并管理笔记与知识库。
byungkyu 的更多技能
浏览全部技能通过托管 OAuth 访问 Microsoft Graph Excel 接口,读写 OneDrive 中的工作簿、工作表、区域、表格与图表。
通过托管的 OAuth GraphQL 接口查询与管理 Linear 的 issue、项目、团队、周期、标签和评论。
通过 OAuth 认证网关管理 Stripe 客户、订阅、发票、产品、价格和支付。
通过托管 OAuth 代理访问 YouTube Data API v3,搜索与管理视频、播放列表、频道、订阅和评论。
通过托管 OAuth 代理调用 WooCommerce REST API,管理商品、订单、客户、优惠券、物流、税务等数据。
通过托管 OAuth 认证,访问并管理 ClickUp 工作区、空间、文件夹、清单与任务等数据。