协作办公
在需要通过 REST API 操作 Notion 页面…
当用户要求读取、创建、更新或删除 Notion 内容,且可用 Notion API token 时,用 curl/jq 或脚本调用 Notion REST API。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在需要通过 REST API 操作 No特定
解决思路
- 检查环境变量 `NOTION_API_TOKEN` 是否可用。
- 如果用户在上下文中提供 API key,则优先使用用户提供的 key。
- 如果两者都没有,使用 AskUserQuestion(或等价方式)向用户请求 API key。
- 绝不显示、记录或发送 `NOTION_API_TOKEN` 到 `Authorization` header 以外的地方;只确认存在、缺失时询问、在请求中使用,绝不回显或暴露。
- 所有请求添加 header:`Authorization: Bearer $NOTION_API_TOKEN`。
- 所有请求添加 header:`Notion-Version: 2025-09-03`。
- 所有请求添加 header:`Content-Type: application/json`。
- 验证认证:用 `curl -s https://api.notion.com/v1/users/me` 并带上上述 headers,通过 `jq` 查看。
- 使用 Base URL `https://api.notion.com`。
- 使用 API Version `2025-09-03` 作为必需 header。
- 所有请求/响应 body 使用 JSON。
- ID 使用 UUIDv4 格式,请求中可省略 dashes。
- 时间戳使用 ISO 8601 格式,例如 `2020-08-12T02:12:33.231Z`。
- 属性名使用 `snake_case`。
- 空值使用 `null`,不要用空字符串。
- 速率限制:平均每 integration 每秒 3 个请求。
- 允许短暂突发超过该限制。
- 收到 HTTP 429 时检查 `Retry-After` header。
- 收到 429 时实现 exponential backoff。
- 请求大小限制:每个 payload 最多 1000 个 block elements。
- 最大 payload 大小 500KB。
- rich text 内容最多 2000 字符。
- URL 最多 2000 字符。
- equation 最多 1000 字符。
- email 地址最多 200 字符。
- 电话号码最多 200 字符。
- multi-select options 最多 100 项。
- relations 最多 100 个相关页面。
- people mentions 最多 100 个用户。
- 每个请求 block arrays 最多 100 个元素。
- 执行修改或删除数据的操作前询问用户确认,包括更新页面或 block。
- 确认包括删除/归档页面或 block。
- 确认包括修改 database schemas。
- 确认包括创建页面(如果多个或批量)。
- 确认包括任何 bulk operations。
- 对逻辑上相关的一组操作,一次确认即可。
- Search:使用 `POST https://api.notion.com/v1/search`。
- Search body 可包含 `query`。
- Search filter 使用 `filter.property=object`、`filter.value=page`。
- Search sort 使用 `sort.direction=descending`、`sort.timestamp=last_edited_time`。
- Search 使用 `page_size=100`。
- Search filter value 可用 `page` 或 `data_source`,或省略以同时搜两者。
- Retrieve a Page:`GET https://api.notion.com/v1/pages/{page_id}`。
- 注意 Retrieve a Page 返回 page properties,不返回 content;获取 content 使用 Retrieve block children 并传 page ID。
- Create a Page:`POST https://api.notion.com/v1/pages`。
- Create a Page parent 可为 `page_id`。
- Create a Page parent 可为 `database_id`(legacy)。
- Create a Page parent 可为 `data_source_id`(API v2025-09-03+)。
- Create a Page properties 包含 `title`,结构为 title 数组和 text content。
- Create a Page children 可包含 block,例如 paragraph 和 rich_text。
- Update a Page:`PATCH https://api.notion.com/v1/pages/{page_id}`。
- Update a Page body 可包含 `properties`(例如 title)、`icon`(type emoji, emoji 📝)、`archived`。
- Update a Page 还可设置 `cover`、`is_locked`、`in_trash`。
- Archive (Delete) a Page:`PATCH https://api.notion.com/v1/pages/{page_id}`,body 设置 `archived: true`。
- Retrieve a Page Property Item:当 property 超过 25 个 references 时,`GET https://api.notion.com/v1/pages/{page_id}/properties/{property_id}`。
- Retrieve Block Children:`GET https://api.notion.com/v1/blocks/{block_id}/children?page_size=100`。
- 获取页面内容时,把 page ID 作为 `block_id`。
- 对每个 block 检查 `has_children` 以获取嵌套内容。
- Append Block Children:`PATCH https://api.notion.com/v1/blocks/{block_id}/children`。
- Append Block Children body 的 `children` 数组最多 100 个 block。
- Append Block Children 最多支持 2 层嵌套。
- Append Block Children 默认追加到末尾。
- Append Block Children 可设置 `position.type=start` 插入开头。
- Append Block Children 可设置 `position.type=after_block` 和 `after_block.id` 插入到指定 block 后。
- Retrieve a Block:`GET https://api.notion.com/v1/blocks/{block_id}`。
- Update a Block:`PATCH https://api.notion.com/v1/blocks/{block_id}`。
- Update a Block body 可包含 `paragraph.rich_text` 等字段;更新会替换指定字段的整个值。
- Delete a Block:`DELETE https://api.notion.com/v1/blocks/{block_id}`。
- Delete a Block 会将 block 移到 trash,可恢复。
- Retrieve a Database:`GET https://api.notion.com/v1/databases/{database_id}`。
- Retrieve a Database 返回 database structure,包括 data sources 和 properties。
- Query a Database:`POST https://api.notion.com/v1/databases/{database_id}/query`。
- Query a Database body 可包含 `filter`(例如 property Status, select equals Done)。
- Query a Database body 可包含 `sorts`(例如 property Created, direction descending)。
- Query a Database 使用 `page_size=100`。
- 过滤器与排序详细语法见 `references/filters-and-sorts.md`。
- Create a Database:`POST https://api.notion.com/v1/databases`。
- Create a Database body 包含 `parent.page_id`。
- Create a Database body 包含 `title` 数组和 text content。
- Create a Database body 可设置 `is_inline: true`。
- Create a Database body 使用 `initial_data_source.properties` 定义属性,如 `Name` title、`Status` select(options 含 name/color)、`Due Date` date。
- Update a Database:`PATCH https://api.notion.com/v1/databases/{database_id}`。
- Update a Database body 可更新 `title`、`description`。
- Create a Data Source(API v2025-09-03+):`POST https://api.notion.com/v1/data_sources`。
- Create a Data Source body 包含 `parent.type=database_id`、`parent.database_id`、`title`、`properties`(如 Name title、Description rich_text)。
- List All Users:`GET https://api.notion.com/v1/users?page_size=100`。
- Retrieve a User:`GET https://api.notion.com/v1/users/{user_id}`。
- Retrieve Bot User (Self):`GET https://api.notion.com/v1/users/me`。
- Retrieve Comments:`GET https://api.notion.com/v1/comments?block_id={block_id}&page_size=100`。
- 获取页面级评论时,把 page ID 作为 `block_id`。
- Create a Comment on a page:`POST https://api.notion.com/v1/comments`,body 包含 `parent.page_id`、`rich_text`。
- Reply to a discussion:`POST https://api.notion.com/v1/comments`,body 包含 `discussion_id`、`rich_text`。
- 注意 API 不能启动新的 inline discussion threads,也不能编辑/删除已有评论。
- 分页端点返回 `has_more`。
- 分页端点返回 `next_cursor`。
- 分页端点返回 `results`。
- 分页迭代:首次请求省略 `start_cursor`。
- 分页迭代:检查响应中的 `has_more`。
- 分页迭代:如果为 `true`,提取 `next_cursor` 并在下一次请求中作为 `start_cursor`。
- 分页迭代:重复直到 `has_more` 为 `false`。
- 分页请求示例 body 包含 `page_size: 100` 和 `start_cursor`。
- 错误处理:400 `invalid_json` 表示 request body 不是有效 JSON。
- 错误处理:400 `invalid_request_url` 表示 URL 格式错误。
- 错误处理:400 `invalid_request` 表示请求不受支持。
- 错误处理:400 `validation_error` 表示 request body 不符合预期 schema。
- 错误处理:400 `missing_version` 表示缺少 Notion-Version header。
- 错误处理:401 `unauthorized` 表示 bearer token 无效。
- 错误处理:403 `restricted_resource` 表示 token 缺少权限。
- 错误处理:404 `object_not_found` 表示资源不存在或未共享给 integration。
- 错误处理:409 `conflict_error` 表示事务中数据冲突。
- 错误处理:429 `rate_limited` 表示超过速率限制,检查 `Retry-After` header。
- 错误处理:500 `internal_server_error` 表示意外服务器错误。
- 错误处理:503 `service_unavailable` 表示 Notion 不可用或超过 60s 超时。
- 错误处理:503 `database_connection_unavailable` 表示数据库无响应。
- 错误处理:504 `gateway_timeout` 表示请求超时。
- 最佳实践:创建 pages/databases 后存储返回的 IDs 供未来更新。
- 最佳实践:使用 Property IDs 而不是名称引用属性,以保持稳定。
- 最佳实践:将多个小操作聚合成更少请求。
- 最佳实践:遵守速率限制,对 429 响应实现 exponential backoff。
- 最佳实践:对 list 端点始终处理分页,检查 `has_more`。
- 最佳实践:更新前先获取当前状态进行验证。
- 最佳实践:使用环境变量,绝不硬编码 API keys。
- 最佳实践:优雅处理错误,检查 response status codes 和 error messages。
- 最佳实践:保持 database schemas 小于 50KB 以获得最佳性能。
- 最佳实践:超过 25 个 page references 的属性需要单独检索。
- 参考文档:`references/block-types.md` 包含所有支持的 block types 及其结构。
- 参考文档:`references/property-types.md` 包含 database property types 和 value formats。
- 参考文档:`references/filters-and-sorts.md` 包含 database query filter 和 sort 语法。
- 参考文档:`references/rich-text.md` 包含 rich text object structure 和 annotations。
适用边界 · 注意事项
- 没有 Notion API token、未把资源共享给 integration,或无法使用 Notion 云服务时。
- 需要在 Notion 中启动新的 inline discussion thread,或编辑/删除已有评论时,API 不支持。
- 需要执行破坏性操作但无法让用户确认时。