Basecamp技能使用说明
Basecamp
通过托管的 OAuth 认证访问 Basecamp 4 API。管理项目、待办事项、消息、日程安排、文档和团队协作。
快速开始
# List all projects
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/basecamp/projects.json')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
基础 URL
https://gateway.maton.ai/basecamp/{resource}.json
网关将请求代理到3.basecampapi.com/{account_id}/并自动注入您的 OAuth 令牌和账户 ID。
重要提示:所有 Basecamp API 的 URL 必须以.json结尾。
认证
所有请求都需要在 Authorization 请求头中包含 Maton API 密钥:
Authorization: Bearer $MATON_API_KEY
环境变量:将您的 API 密钥设置为MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
获取您的 API 密钥
连接管理
在以下网址管理您的Basecamp OAuth连接https://ctrl.maton.ai。
列出连接
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=basecamp&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': 'basecamp'}).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
响应:
{
"connection": {
"connection_id": "71e313c8-9100-48c6-8ea1-6323f6fafd04",
"status": "ACTIVE",
"creation_time": "2026-02-08T03:12:39.815086Z",
"last_updated_time": "2026-02-08T03:12:59.259878Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "basecamp",
"metadata": {}
}
}
在浏览器中打开返回的url以完成OAuth授权。
删除连接
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
指定连接
如果您有多个Basecamp连接,请使用Maton-Connection请求头指定要使用的连接:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/basecamp/projects.json')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '71e313c8-9100-48c6-8ea1-6323f6fafd04')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
如果省略,网关将使用默认(最早创建的)活跃连接。
API参考
用户信息
获取当前用户
GET /basecamp/my/profile.json
响应:
{
"id": 51197030,
"name": "Chris Kim",
"email_address": "chris@example.com",
"admin": true,
"owner": true,
"time_zone": "America/Los_Angeles",
"avatar_url": "https://..."
}
人员操作
列出人员
GET /basecamp/people.json
响应:
[
{
"id": 51197030,
"name": "Chris Kim",
"email_address": "chris@example.com",
"admin": true,
"owner": true,
"employee": true,
"time_zone": "America/Los_Angeles"
}
]
获取人员
GET /basecamp/people/{person_id}.json
列出项目成员
GET /basecamp/projects/{project_id}/people.json
项目操作
列出项目
GET /basecamp/projects.json
响应:
[
{
"id": 46005636,
"status": "active",
"name": "Getting Started",
"description": "Quickly get up to speed with everything Basecamp",
"created_at": "2026-02-05T22:59:26.087Z",
"url": "https://3.basecampapi.com/6153810/projects/46005636.json",
"dock": [...]
}
]
获取项目
GET /basecamp/projects/{project_id}.json
项目响应包含一个停靠栏数组,其中包含可用工具(留言板、待办事项集、保险库、聊天、日程安排等)。每个停靠栏项目具有:
id:工具的ID名称:工具类型(例如,"todoset"、"message_board")启用状态:工具是否处于活动状态网址:访问该工具的直接URL
创建项目
POST /basecamp/projects.json
Content-Type: application/json
{
"name": "New Project",
"description": "Project description"
}
更新项目
PUT /basecamp/projects/{project_id}.json
Content-Type: application/json
{
"name": "Updated Project Name",
"description": "Updated description"
}
删除(移至回收站)项目
DELETE /basecamp/projects/{project_id}.json
待办事项操作
获取待办事项集
首先,从项目的dock获取待办事项集合ID:
GET /basecamp/buckets/{project_id}/todosets/{todoset_id}.json
列出待办事项清单
GET /basecamp/buckets/{project_id}/todosets/{todoset_id}/todolists.json
响应:
[
{
"id": 9550474442,
"title": "Basecamp essentials",
"description": "",
"completed": false,
"completed_ratio": "0/5",
"url": "https://..."
}
]
创建待办事项清单
POST /basecamp/buckets/{project_id}/todosets/{todoset_id}/todolists.json
Content-Type: application/json
{
"name": "New Todo List",
"description": "List description"
}
获取待办事项清单
GET /basecamp/buckets/{project_id}/todolists/{todolist_id}.json
列出待办事项
GET /basecamp/buckets/{project_id}/todolists/{todolist_id}/todos.json
响应:
[
{
"id": 9550474446,
"content": "Start here",
"description": "",
"completed": false,
"due_on": null,
"assignees": []
}
]
创建待办事项
POST /basecamp/buckets/{project_id}/todolists/{todolist_id}/todos.json
Content-Type: application/json
{
"content": "New todo item",
"description": "Todo description",
"due_on": "2026-02-15",
"assignee_ids": [51197030]
}
响应:
{
"id": 9555973289,
"content": "New todo item",
"completed": false
}
更新待办事项
PUT /basecamp/buckets/{project_id}/todos/{todo_id}.json
Content-Type: application/json
{
"content": "Updated todo",
"description": "Updated description"
}
完成待办事项
POST /basecamp/buckets/{project_id}/todos/{todo_id}/completion.json
成功时返回204。
取消完成待办事项
DELETE /basecamp/buckets/{project_id}/todos/{todo_id}/completion.json
留言板操作
获取留言板
GET /basecamp/buckets/{project_id}/message_boards/{message_board_id}.json
列出消息
GET /basecamp/buckets/{project_id}/message_boards/{message_board_id}/messages.json
创建消息
POST /basecamp/buckets/{project_id}/message_boards/{message_board_id}/messages.json
Content-Type: application/json
{
"subject": "Message Subject",
"content": "<p>Message body with HTML</p>",
"category_id": 123
}
获取消息
GET /basecamp/buckets/{project_id}/messages/{message_id}.json
更新消息
PUT /basecamp/buckets/{project_id}/messages/{message_id}.json
Content-Type: application/json
{
"subject": "Updated Subject",
"content": "<p>Updated content</p>"
}
日程操作
获取日程
GET /basecamp/buckets/{project_id}/schedules/{schedule_id}.json
列出日程条目
GET /basecamp/buckets/{project_id}/schedules/{schedule_id}/entries.json
创建日程条目
POST /basecamp/buckets/{project_id}/schedules/{schedule_id}/entries.json
Content-Type: application/json
{
"summary": "Team Meeting",
"description": "Weekly sync",
"starts_at": "2026-02-15T14:00:00Z",
"ends_at": "2026-02-15T15:00:00Z",
"all_day": false,
"participant_ids": [51197030]
}
更新日程条目
PUT /basecamp/buckets/{project_id}/schedule_entries/{entry_id}.json
Content-Type: application/json
{
"summary": "Updated Meeting",
"starts_at": "2026-02-15T15:00:00Z",
"ends_at": "2026-02-15T16:00:00Z"
}
保管库(文档与文件)操作
获取保管库
GET /basecamp/buckets/{project_id}/vaults/{vault_id}.json
列出保管库中的文档
GET /basecamp/buckets/{project_id}/vaults/{vault_id}/documents.json
创建文档
POST /basecamp/buckets/{project_id}/vaults/{vault_id}/documents.json
Content-Type: application/json
{
"title": "Document Title",
"content": "<p>Document content with HTML</p>"
}
列出保管库中的上传文件
GET /basecamp/buckets/{project_id}/vaults/{vault_id}/uploads.json
营火(聊天)操作
列出所有营火
GET /basecamp/chats.json
获取营火
GET /basecamp/buckets/{project_id}/chats/{chat_id}.json
列出营火消息线
GET /basecamp/buckets/{project_id}/chats/{chat_id}/lines.json
创建营火消息线
POST /basecamp/buckets/{project_id}/chats/{chat_id}/lines.json
Content-Type: application/json
{
"content": "Hello from the API!"
}
评论操作
列出录音的评论
GET /basecamp/buckets/{project_id}/recordings/{recording_id}/comments.json
创建评论
POST /basecamp/buckets/{project_id}/recordings/{recording_id}/comments.json
Content-Type: application/json
{
"content": "<p>Comment text</p>"
}
录制状态操作
所有内容项(待办事项、消息、文档等)都是可以归档或丢弃的“录制内容”。
丢弃录制内容
PUT /basecamp/buckets/{project_id}/recordings/{recording_id}/status/trashed.json
归档录制内容
PUT /basecamp/buckets/{project_id}/recordings/{recording_id}/status/archived.json
取消归档录制内容
PUT /basecamp/buckets/{project_id}/recordings/{recording_id}/status/active.json
模板操作
列出模板
GET /basecamp/templates.json
从模板创建项目
POST /basecamp/templates/{template_id}/project_constructions.json
Content-Type: application/json
{
"name": "New Project from Template",
"description": "Description"
}
分页
Basecamp使用Link头进行分页rel="next":
响应头:
Link: <https://3.basecampapi.com/.../page=2>; rel="next"
X-Total-Count: 150
请遵循Link头中的URL来获取下一页。当next不存在时,即表示已到达最后一页。
重要提示:请勿手动构建分页URL。务必使用Link头中提供的URL。
核心概念
存储桶与项目
"存储桶"是项目的内容容器。在URL中,存储桶ID与项目ID相同:
/buckets/{project_id}/todosets/{todoset_id}.json
功能坞
每个项目都有一个"功能坞",其中包含可用的工具。使用任何工具前,请务必确认其状态为enabled: true:
{
"dock": [
{"name": "todoset", "id": 123, "enabled": true},
{"name": "message_board", "id": 456, "enabled": false}
]
}
记录项
所有内容项目(待办事项、消息、文档、评论等)都是"记录项",具有以下属性:
状态: "活跃"、"已归档" 或 "已删除"父级: 指向容器的导航- 可在各端点间使用的唯一标识符
代码示例
JavaScript
const response = await fetch(
'https://gateway.maton.ai/basecamp/projects.json',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const projects = await response.json();
Python
import os
import requests
response = requests.get(
'https://gateway.maton.ai/basecamp/projects.json',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
projects = response.json()
备注
- 所有 API 路径必须以
.json - 结尾
- 网关会自动注入账户 ID
- 使用 Basecamp 4 API (bc3-api)
- 时间戳采用 ISO 8601 格式
HTML 内容使用<div>、<p>、<strong>、<em>、<a>、<ol>,<li>标签速率限制:约每10秒每个IP 50个请求 - 重要提示:当通过管道将curl输出传递给
- jq
或其他命令时,像$MATON_API_KEY这样的环境变量,在某些shell环境中可能无法正确展开错误处理
状态码
| 含义 | 400 |
|---|---|
| 缺少Basecamp连接或请求错误 | 401 |
| Maton API密钥无效或缺失 | 404 |
| 资源未找到、已删除或无访问权限 | 429 |
| 超出速率限制(请检查Retry-After响应头) | 507 |
| 达到账户限制(例如,项目数量限制) | Account limit reached (e.g., project limit) |
| 5xx | 服务器错误(请尝试指数退避重试) |
故障排除:API密钥问题
- 检查是否已设置
MATON_API_KEY环境变量:
echo $MATON_API_KEY
- 通过列出连接来验证API密钥是否有效:
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
故障排除:无效的应用名称
- 确保您的URL路径以
basecamp开头。例如:
- 正确示例:
https://gateway.maton.ai/basecamp/projects.json - 错误示例:
https://gateway.maton.ai/projects.json


微信扫一扫,打赏作者吧~