Notion Public API 介绍

January 6, 2024

 

Notion的页面组织结构非常灵活,但是一直没有找到相关介绍,最近了解到一个使用Notion作为后台CMS的项目,浏览了一下源码和Notion API。通过API也能大致了解下官方开放的能力以及相关数据结构。

pages


page内容主要由两部分构成

page properties

指定page的基础信息,基础数据结构详见文档,包括:

Loading...

所有的page都有一个parent,当其parent为database时(也就是当前page为db中的一条记录时), properties 格式与db的property格式一致。否则 properties 仅包含一个 title属性。

page content

一个页面的内容由多个块(block)组成。这些块被称为页面的子块。每个块都有一个类型,例如段落( paragraph)、标题( heading)或图像(image)。某些类型的块,例如切换列表(toggle list),还有自己的嵌套子块。

段落块(Paragraph blocks)是文档结构中的一个基本组成单元,block具有一些通用的属性,包括:

Loading...

除此之外,块还包含了一些特定于其类型的属性,这些属性存储在paragraph 属性中,其内容与具体的block type有关,具体见文档

以todo block类型为例,paragraph的内容格式如下:

Loading...

注意

  • 除了 list等明显的block外,还存在很多支持嵌套的类型,故API返回的block列表并非扁平化的数据。而是存在多级嵌套关系。比如 paragraph 也可以嵌套子 paragraph
  • 还有unsupported类型的block type没有对外开放,比如database view。
  • 许多块类型支持富文本。在支持的情况下,块类型对象将包含一个 rich_text 对象。所有 rich_text 对象都将包含一个 plain_text 属性,这为开发人员从 Notion 块中访问未格式化的文本提供了一种方便的方法。

page相关接口包括:

接口名HTTP MethodURL功能说明
post-pagePOSThttps://api.notion.com/v1/pages创建page,parent只能是一个已存在page或database。不包括page内容。
patch-block-childrenPATCH 增加内容只能
retrieve-a-pageGEThttps://api.notion.com/v1/pages/{page_id}取page的属性property,不包括content。
property数量限制在25个。如果超过25,使用下面的接口。   
如果page的parent是db类型,property信息与db的property schema一致。   
https://developers.notion.com/reference/retrieve-a-page-propertyGEThttps://api.notion.com/v1/pages/{page_id}/properties/{property_id}根据page_id和property_id取property(列表)信息。支持分页,用于property大于25的场景。
https://developers.notion.com/reference/patch-pagePATCHhttps://api.notion.com/v1/pages/{page_id}支持更新parent为db类型page的property值(即更新db中的某条记录)。
也可以更新任意page类型的icon、cover、archive等公共属性。   

block相关的接口包括:

接口名HTTP MethodURL功能说明
https://developers.notion.com/reference/patch-block-childrenPATCHhttps://api.notion.com/v1/blocks/{block_id}/children为block、page、db增加子block。
api限制每次最多新增100个block。对于有child类型的block,api限制在单词请求中存在最高2层的child block嵌套。   
https://developers.notion.com/reference/retrieve-a-blockGEThttps://api.notion.com/v1/blocks/{block_id}取一个block的数据。如果has_children为true,使用retrieve block child接口取其children信息。// 感觉有点鸡肋
https://developers.notion.com/reference/get-block-childrenGEThttps://api.notion.com/v1/blocks/{block_id}/children翻页的方式取block的children列表。https://developers.notion.com/docs/working-with-page-content#modeling-content-as-blocks也是通过block list来组织的。
仅返回第一级的children,如果children也有嵌套的子block需要通过api递归获取。   
https://developers.notion.com/reference/update-a-blockPATCHhttps://api.notion.com/v1/blocks/{block_id}更新block_id的内容。
https://developers.notion.com/reference/delete-a-blockDELETEhttps://api.notion.com/v1/blocks/{block_id}删除block

databases


数据库是 Notion 工作区中的page集合,可以根据需要过滤、排序和组织。允许用户在 Notion 中创建和操作结构化数据。

目前public API不支持两种db:Linked databases、Wiki databases

database数据结构:

Loading...

properties 中存储DB字段相关定义map,key为字段名称,value为字段属性object,其定义与属性字段类型相关。

Loading...
  • 属性类型 title 比较特殊,每个db都有一个具有title类型的属性。这种类型的属性是指数据库中每个项目的页面标题。
  • 类型的值对应于属性对象中的另一个键。每个属性对象都有一个与其类型值相同的嵌套属性。例如,“Last ordered”的类型为“date”,并且它还有一个date属性。这种模式在许多对象上都使用了Notion API,我们称之为特定类型的数据。
  • 某些属性对象类型具有额外的配置。例如,Price的类型为“number”。Number属性对象在number属性内部具有额外的配置。在此示例中,格式配置设置为“美元”,以控制此列中页面属性值的外观。

插入page到DB

向db中插入一个page时,需要指定其属性定义与db属性定义一致,同时parent信息为database的id。

Loading...

注意:组织上面的properties数据结构比较麻烦,容易出错。所以更好的方案是在构造page记录前使用database的retrieve接口,先获取到db的properties数据结构后再填充相关字段值。

插入page成功后会返回对应的pageid,这时再使用pageid填充block内容即可。

查询db

通过Query接口可以查询db中的部分page。

  • filter 用于指定查询条件,多个条件可以相互组合。格式

客户端中的filter设置

Loading...
Loading...

查询接口返回db中已过滤&排序的page数组,格式大致如下:

Loading...
  • 仅返回page信息,不包括其block内容。
  • 通过翻页方式返回,每次最大返回100条page。
  • 如果需要遍历所有记录,需通过 start_cursor 、 page_size 参数指定翻页条件

files and media


  • notion优先推荐将文件存储到外部系统,以链接的方式插入db或page。(每个page的大小限制为10M?)
  • notion也提供了文件上传能力,将文件存储在notion的s3实例中提供访问。
    • 文件上传目前notion API不支持,只能通过客户端上传
    • 当通过page或db的接口读取到文件的url后,可以通过url下载文件。url只有1个小时的有效期,具体过期时间通过expiry_time指定。
    Loading...

database相关的接口

接口名HTTP MethodURL功能说明
https://developers.notion.com/reference/create-a-databasePOSThttps://api.notion.com/v1/databases在指定的(parent)page插入一个db,同时需要指定db的属性schema(property)。parent只能是page或者wiki database类型。
https://developers.notion.com/reference/post-database-queryPOSThttps://api.notion.com/v1/databases/{database_id}/query分页获取db中的page记录列表,可以通过filter、sort指定查询条件。
https://developers.notion.com/reference/retrieve-a-databaseGEThttps://api.notion.com/v1/databases/{database_id}获取https://developers.notion.com/reference/database,包括db基础信息以及properties字段。
https://developers.notion.com/reference/update-a-databasePATCHhttps://api.notion.com/v1/databases/{database_id}更新db对象,包括title、description或者properties

comments


notion支持两种形态的comment,对page的评论和对文本内容(block)的评论。

通过API访问时需要有page对应的comment权限,包括:

  1. Read comments.
  2. Write (or insert) comments.

使用公共API可以实现:

  • 给页面添加评论。
  • 对内联评论做出回应(即向现有讨论线程添加评论)。
  • 读取一个块或页面上开放(”open” or “un-resolved”)的评论。

不支持的点:

  • 启动新的讨论线程。
  • 编辑现有的评论。
  • 检索已解决(resolved)的评论。

读取page或者block的评论

请求方式:

Loading...

应答格式详见文档

增加评论

重点参数为parent(page或者block)、rich-text

See all postsSee all posts