openclaw-notion-api
使用 Notion API 创建/读取/更新页面、数据源(数据库)和块。
Setup(设置)
- 在 https://www.notion.so/profile/integrations/internal 创建内部集成
- 复制 API 密钥(以
ntn_或secret_开头) - 存储密钥:
mkdir -p ~/.config/notion
echo "ntn_your_key_here" > ~/.config/notion/api_key
- 将目标页面/数据库与集成共享(点击 "..." → "Connect to" → 你的集成名称)
API Basics(API 基础)
所有请求都需要:
NOTION_KEY=$(cat ~/.config/notion/api_key)
curl -X GET "https://api.notion.com/v1/..." \
-H "Authorization: Bearer $NOTION_KEY" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json"
注意:
Notion-Versionheader 是必需的。本技能使用2025-09-03(最新版本)。在此版本中,数据库在 API 中称为"数据源"。
Common Operations(常用操作)
搜索页面和数据源:
curl -X POST "https://api.notion.com/v1/search" \
-H "Authorization: Bearer $NOTION_KEY" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json" \
-d '{"query": "page title"}'
获取页面:
curl "https://api.notion.com/v1/pages/{page_id}" \
-H "Authorization: Bearer $NOTION_KEY" \
-H "Notion-Version: 2025-09-03"
获取页面内容(块):
curl "https://api.notion.com/v1/blocks/{page_id}/children" \
-H "Authorization: Bearer $NOTION_KEY" \
-H "Notion-Version: 2025-09-03"
在数据源中创建页面:
curl -X POST "https://api.notion.com/v1/pages" \
-H "Authorization: Bearer $NOTION_KEY" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json" \
-d '{
"parent": {"database_id": "xxxxxx"},
"properties": {
"Name": {"title": [{"text": {"content": "New Item"}}]},
"Status": {"select": {"name": "Todo"}}
}
}'
查询数据源(数据库):
curl -X POST "https://api.notion.com/v1/data_sources/{data_source_id}/query" \
-H "Authorization: Bearer $NOTION_KEY" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json" \
-d '{
"filter": {"property": "Status", "select": {"equals": "Active"}},
"sorts": [{"property": "Date", "direction": "descending"}]
}'
创建数据源(数据库):
curl -X POST "https://api.notion.com/v1/data_sources" \
-H "Authorization: Bearer $NOTION_KEY" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json" \
-d '{
"parent": {"page_id": "xxx"},
"title": [{"text": {"content": "My Database"}}],
"properties": {
"Name": {"title": {}},
"Status": {"select": {"options": [{"name": "Todo"}, {"name": "Done"}]}},
"Date": {"date": {}}
}
}'
更新页面属性:
curl -X PATCH "https://api.notion.com/v1/pages/{page_id}" \
-H "Authorization: Bearer $NOTION_KEY" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json" \
-d '{"properties": {"Status": {"select": {"name": "Done"}}}}'
向页面添加块:
curl -X PATCH "https://api.notion.com/v1/blocks/{page_id}/children" \
-H "Authorization: Bearer $NOTION_KEY" \
-H "Notion-Version: 2025-09-03" \
-H "Content-Type: application/json" \
-d '{
"children": [
{"type": "paragraph", "paragraph": {"rich_text": [{"text": {"content": "Hello"}}]}}
]
}'
Property Types(属性类型)
数据库项的常用属性格式:
- 标题(Title):
{"title": [{"text": {"content": "..."}}]} - 富文本(Rich text):
{"rich_text": [{"text": {"content": "..."}}]} - 选择(Select):
{"select": {"name": "Option"}} - 多选(Multi-select):
{"multi_select": [{"name": "A"}, {"name": "B"}]} - 日期(Date):
{"date": {"start": "2024-01-15", "end": "2024-01-16"}} - 复选框(Checkbox):
{"checkbox": true} - 数字(Number):
{"number": 42} - URL:
{"url": "https://..."} - 邮箱(Email):
{"email": "a@b.com"} - 关联(Relation):
{"relation": [{"id": "page_id"}]}
Key Differences in 2025-09-03(2025-09-03 版本的关键差异)
- 数据库 → 数据源: 使用
/data_sources/端点进行查询和检索 - 双 ID: 每个数据库现在同时拥有
database_id和data_source_id- 创建页面时使用
database_id(parent: {"database_id": "..."}) - 查询时使用
data_source_id(POST /v1/data_sources/{id}/query)
- 创建页面时使用
- 搜索结果: 数据库以
"object": "data_source"形式返回,并带有其data_source_id - 响应中的父级: 页面显示
parent.data_source_id以及parent.database_id - 查找 data_source_id: 搜索数据库,或调用
GET /v1/data_sources/{data_source_id}
File Upload(文件上传)
使用 Direct Upload 方法上传图片或文件到 Notion(文件大小不超过 20MB)。两者的步骤完全相同,仅在 Step 3 的块类型上有区别。
Step 1: Create File Upload Object(创建文件上传对象)
创建上传对象以获取上传 URL:
curl --request POST \
--url 'https://api.notion.com/v1/file_uploads' \
-H "Authorization: Bearer $NOTION_KEY" \
-H 'Content-Type: application/json' \
-H 'Notion-Version: 2025-09-03' \
--data '{}'
响应包含:
id:文件上传 ID(在步骤 3 中使用)upload_url:上传文件内容的 URL
Step 2: Upload File Content(上传文件内容)
使用 multipart/form-data 上传实际的文件:
curl --request POST \
--url 'https://api.notion.com/v1/file_uploads/{file_upload_id}/send' \
-H "Authorization: Bearer $NOTION_KEY" \
-H 'Notion-Version: 2025-09-03' \
-H 'Content-Type: multipart/form-data' \
-F "file=@/path/to/file.png"
重要:
- 使用
POST方法(不是 PUT) - 包含
Authorization和Notion-Versionheaders - 使用
-F进行 multipart/form-data - 文件大小必须 ≤ 20MB
Step 3: Insert into Page(插入到页面)
将上传的文件作为块添加。根据文件类型选择不同的块类型:
上传图片:
curl --request PATCH \
--url "https://api.notion.com/v1/blocks/{page_id}/children" \
-H "Authorization: Bearer $NOTION_KEY" \
-H 'Content-Type: application/json' \
-H 'Notion-Version: 2025-09-03' \
--data '{
"children": [
{
"type": "image",
"image": {
"type": "file_upload",
"file_upload": {
"id": "{file_upload_id}"
}
}
}
]
}'
上传文件:
curl --request PATCH \
--url "https://api.notion.com/v1/blocks/{page_id}/children" \
-H "Authorization: Bearer $NOTION_KEY" \
-H 'Content-Type: application/json' \
-H 'Notion-Version: 2025-09-03' \
--data '{
"children": [
{
"type": "file",
"file": {
"type": "file_upload",
"file_upload": {
"id": "{file_upload_id}"
}
}
}
]
}'
注意: 不要在块定义中包含 "object": "block"。
Common Errors(常见错误)
- invalid_request_url:检查是否使用了
POST方法和正确的 URL 格式 - unauthorized:确保步骤 2 中存在
Authorization和Notion-Versionheaders - validation_error:必须在附加(步骤 3)之前上传文件(步骤 2)
Notes(注意事项)
- 页面/数据库 ID 是 UUID(带或不带连字符)
- API 无法设置数据库视图过滤器 — 这是 UI 专属功能
- 速率限制:平均约 3 请求/秒
- 创建数据源时使用
is_inline: true以将其嵌入页面中