Notion API を使用してデータベースを操作する
Notion で Integration を作成して Notion API を使用してデータベースを操作するまでの手順メモ。
準備
1. Integration を作成する
My integrations ページに遷移します。
Create new integration
をクリックします。
Name
には任意の Integration 名を入力します。
今回は Example Integration
としておきます。
Associated workspace
には Integration をインストールするワークスペースを選択します。
自身がワークスペースの Admin レベルの権限を持っている必要があります。
Capabilities
には Integration から実行できる機能を選択します。
次のような項目があります。
Integration の用途に合わせて適切に設定してください。
-
Content Capabilities
-
Read content
: コンテンツの読み取り -
Update content
: 既存のコンテンツの更新 -
Insert content
: 新しいコンテンツの作成
-
-
Comment Capabilities
-
Read comments
: コメントの読み取り -
Insert comments
: コメントの作成
-
-
User Capabilities
-
No user information
: ユーザー情報にはアクセスさせない -
Read user information without email addresses
: メールアドレス以外のユーザー情報の読み取り -
Read user information including email addresses
: メールアドレスを含めたユーザー情報の読み取り
-
これらの項目は全て後から変更できます。
それぞれ入力できたら Submit
をクリックします。
これで Integration が作成されます。
Integration を作成するとトークンが発行されます。
Internal Integration Token
の Show
をクリックすると secret_
から始まるトークンが確認できます。
このトークンは Notion API を実行するときに必要になるため、ひかえておきます。
2. データベースを作成する
Notion API で操作するデータベースを作成します。
今回はこんな感じのデータベースを作成しました。
作成したデータベースの ID を確認します。
データベースの URL は次のような形式になっています。
データベースID
が Notion API で操作するときに必要になるため、ひかえておきます。
https://www.notion.so/<データベースID>?v=<ビューID>
3. Integration からデータベースにアクセスできるようにする
Integration は最初はワークスペース内のどのコンテンツにもアクセスできません。
そのため、アクセスしたいページやデータベースで設定を行う必要があります。
「2. データベースを作成する」手順で作成したデータベースのページに遷移します。
右上の三点リーダ → Add connections
→ 「1. Integration を作成する」手順で作成した Integration の順にクリックします。
確認ダイアログが表示されるので、 Confirm
をクリックします。
これで Integration からこのページと子ページにアクセスできるようになります。
Notion API を使ってみる
データベースの情報を取得する
次のエンドポイントに GET
リクエストを送信することで特定のデータベースの情報を取得することができます。
https://api.notion.com/v1/databases/<データベースID>
次のコマンドは curl
を使用して特定のデータベース情報を取得する例です。
$ curl 'https://api.notion.com/v1/databases/<データベースID>' \
-H 'Authorization: Bearer <Integrationトークン>' \
-H 'Notion-Version: 2022-06-28'
出力例
{
"object": "database",
"id": "********-****-****-****-************",
"cover": null,
"icon": null,
"created_time": "2023-02-25T01:04:00.000Z",
"created_by": {
"object": "user",
"id": "********-****-****-****-************"
},
"last_edited_by": {
"object": "user",
"id": "********-****-****-****-************"
},
"last_edited_time": "2023-02-25T01:17:00.000Z",
"title": [
{
"type": "text",
"text": {
"content": "Example Database",
"link": null
},
"annotations": {
"bold": false,
"italic": false,
"strikethrough": false,
"underline": false,
"code": false,
"color": "default"
},
"plain_text": "Example Database",
"href": null
}
],
"description": [],
"is_inline": false,
"properties": {
"Status": {
"id": "****",
"name": "Status",
"type": "status",
"status": {
"options": [
{
"id": "********-****-****-****-************",
"name": "Not started",
"color": "default"
},
{
"id": "********-****-****-****-************",
"name": "In progress",
"color": "blue"
},
{
"id": "********-****-****-****-************",
"name": "Done",
"color": "green"
}
],
"groups": [
{
"id": "********-****-****-****-************",
"name": "To-do",
"color": "gray",
"option_ids": ["********-****-****-****-************"]
},
{
"id": "********-****-****-****-************",
"name": "In progress",
"color": "blue",
"option_ids": ["********-****-****-****-************"]
},
{
"id": "********-****-****-****-************",
"name": "Complete",
"color": "green",
"option_ids": ["********-****-****-****-************"]
}
]
}
},
"Assign": {
"id": "******",
"name": "Assign",
"type": "people",
"people": {}
},
"Name": {
"id": "title",
"name": "Name",
"type": "title",
"title": {}
}
},
"parent": {
"type": "workspace",
"workspace": true
},
"url": "https://www.notion.so/<データベースID>",
"archived": false
}
データベースのアイテム一覧を取得する
次のエンドポイントに POST
リクエストを送信することで特定のデータベースのアイテム一覧を取得することができます。
https://api.notion.com/v1/databases/<データベースID>/query
次のコマンドは curl
を使用して特定のデータベースのアイテム一覧を取得する例です。
$ curl -X POST 'https://api.notion.com/v1/databases/<データベースID>/query' \
-H 'Authorization: Bearer <Integrationトークン>' \
-H 'Notion-Version: 2022-06-28'
出力例
{
"object": "list",
"results": [
{
"object": "page",
"id": "********-****-****-****-************",
"created_time": "2023-02-25T01:04:00.000Z",
"last_edited_time": "2023-02-25T01:33:00.000Z",
"created_by": {
"object": "user",
"id": "********-****-****-****-************"
},
"last_edited_by": {
"object": "user",
"id": "********-****-****-****-************"
},
"cover": null,
"icon": null,
"parent": {
"type": "database_id",
"database_id": "********-****-****-****-************"
},
"archived": false,
"properties": {
"Status": {
"id": "****",
"type": "status",
"status": {
"id": "********-****-****-****-************",
"name": "Not started",
"color": "default"
}
},
"Assign": {
"id": "******",
"type": "people",
"people": []
},
"Name": {
"id": "title",
"type": "title",
"title": [
{
"type": "text",
"text": {
"content": "Card 2",
"link": null
},
"annotations": {
"bold": false,
"italic": false,
"strikethrough": false,
"underline": false,
"code": false,
"color": "default"
},
"plain_text": "Card 2",
"href": null
}
]
}
},
"url": "https://www.notion.so/Card-2-********************************"
},
{
"object": "page",
"id": "********-****-****-****-************",
"created_time": "2023-02-25T01:04:00.000Z",
"last_edited_time": "2023-02-25T01:04:00.000Z",
"created_by": {
"object": "user",
"id": "********-****-****-****-************"
},
"last_edited_by": {
"object": "user",
"id": "********-****-****-****-************"
},
"cover": null,
"icon": null,
"parent": {
"type": "database_id",
"database_id": "********-****-****-****-************"
},
"archived": false,
"properties": {
"Status": {
"id": "****",
"type": "status",
"status": {
"id": "********-****-****-****-************",
"name": "Not started",
"color": "default"
}
},
"Assign": {
"id": "******",
"type": "people",
"people": []
},
"Name": {
"id": "title",
"type": "title",
"title": [
{
"type": "text",
"text": {
"content": "Card 1",
"link": null
},
"annotations": {
"bold": false,
"italic": false,
"strikethrough": false,
"underline": false,
"code": false,
"color": "default"
},
"plain_text": "Card 1",
"href": null
}
]
}
},
"url": "https://www.notion.so/Card-1-********************************"
},
{
"object": "page",
"id": "********-****-****-****-************",
"created_time": "2023-02-25T01:04:00.000Z",
"last_edited_time": "2023-02-25T01:33:00.000Z",
"created_by": {
"object": "user",
"id": "********-****-****-****-************"
},
"last_edited_by": {
"object": "user",
"id": "********-****-****-****-************"
},
"cover": null,
"icon": null,
"parent": {
"type": "database_id",
"database_id": "********-****-****-****-************"
},
"archived": false,
"properties": {
"Status": {
"id": "****",
"type": "status",
"status": {
"id": "********-****-****-****-************",
"name": "Not started",
"color": "default"
}
},
"Assign": {
"id": "******",
"type": "people",
"people": []
},
"Name": {
"id": "title",
"type": "title",
"title": [
{
"type": "text",
"text": {
"content": "Card 3",
"link": null
},
"annotations": {
"bold": false,
"italic": false,
"strikethrough": false,
"underline": false,
"code": false,
"color": "default"
},
"plain_text": "Card 3",
"href": null
}
]
}
},
"url": "https://www.notion.so/Card-3-********************************"
}
],
"next_cursor": null,
"has_more": false,
"type": "page",
"page": {}
}
フィルター
リクエストボディに filter
を設定することでアイテムをフィルタして取得することができます。
次のコマンドは curl
を使用して status
型の Status
プロパティが Not started
であるアイテムをフィルタして取得する例です。
$ curl -X POST 'https://api.notion.com/v1/databases/<データベースID>/query' \
-H 'Authorization: Bearer <Integrationトークン>' \
-H 'Content-Type: application/json' \
-H 'Notion-Version: 2022-06-28' \
--data '{
"filter": {
"property": "Status",
"status": {
"equals": "Not started"
}
}
}'
また、 and
や or
を使用して複数の条件を指定することもできます。
次のコマンドは curl
を使用して status
型の Status
プロパティが Not started
もしくは In progress
であるアイテムをフィルタして取得する例です。
$ curl -X POST 'https://api.notion.com/v1/databases/<データベースID>/query' \
-H 'Authorization: Bearer <Integrationトークン>' \
-H 'Content-Type: application/json' \
-H 'Notion-Version: 2022-06-28' \
--data '{
"filter": {
"or": [
{
"property": "Status",
"status": {
"equals": "Not started"
}
},
{
"property": "Status",
"status": {
"equals": "In progress"
}
}
]
}
}'
その他の詳しいフィルタの指定方法については以下の公式リファレンスをご参照ください。
ソート
リクエストボディに sorts
を設定することでアイテムをソートして取得することができます。
次のコマンドは curl
を使用してアイテムを Name
プロパティで昇順にソートして取得する例です。
$ curl -X POST 'https://api.notion.com/v1/databases/<データベースID>/query' \
-H 'Authorization: Bearer <Integrationトークン>' \
-H 'Content-Type: application/json' \
-H 'Notion-Version: 2022-06-28' \
--data '{
"sorts": [
{
"property": "Name",
"direction": "ascending"
}
]
}'
複数のソート条件を指定することもできます。
次のコマンドは curl
を使用してアイテムを Name
プロパティで昇順・ Status
プロパティで降順にソートして取得する例です。
複数指定した場合は最初の要素が優先されます。
$ curl -X POST 'https://api.notion.com/v1/databases/<データベースID>/query' \
-H 'Authorization: Bearer <Integrationトークン>' \
-H 'Content-Type: application/json' \
-H 'Notion-Version: 2022-06-28' \
--data '{
"sorts": [
{
"property": "Name",
"direction": "ascending"
},
{
"property": "Status",
"direction": "descending"
}
]
}'
その他の詳しいソートの指定方法については以下の公式リファレンスをご参照ください。
データベースにアイテムを追加する
次のエンドポイントに POST
リクエストを送信することでアイテム ( ページ ) を作成することができます。
https://api.notion.com/v1/pages
次のコマンドは curl
を使用して アイテムのタイトル
という名前で Status
プロパティが In progress
であるアイテムを作成するコマンドです。
$ curl -X POST 'https://api.notion.com/v1/pages' \
-H 'Authorization: Bearer <Integrationトークン>' \
-H 'Content-Type: application/json' \
-H 'Notion-Version: 2022-06-28' \
--data '{
"parent": { "database_id": "<データベースID>" },
"properties": {
"Name": {
"title": [
{ "text": { "content": "アイテムのタイトル" } }
]
},
"Status": {
"status": { "name": "In progress" }
}
}
}'
出力例
{
"object": "page",
"id": "********-****-****-****-************",
"created_time": "2023-02-25T02:14:00.000Z",
"last_edited_time": "2023-02-25T02:14:00.000Z",
"created_by": {
"object": "user",
"id": "********-****-****-****-************"
},
"last_edited_by": {
"object": "user",
"id": "********-****-****-****-************"
},
"cover": null,
"icon": null,
"parent": {
"type": "database_id",
"database_id": "********-****-****-****-************"
},
"archived": false,
"properties": {
"Status": {
"id": "****",
"type": "status",
"status": {
"id": "********-****-****-****-************",
"name": "In progress",
"color": "blue"
}
},
"Assign": {
"id": "******",
"type": "people",
"people": []
},
"Name": {
"id": "title",
"type": "title",
"title": [
{
"type": "text",
"text": {
"content": "アイテムのタイトル",
"link": null
},
"annotations": {
"bold": false,
"italic": false,
"strikethrough": false,
"underline": false,
"code": false,
"color": "default"
},
"plain_text": "アイテムのタイトル",
"href": null
}
]
}
},
"url": "https://www.notion.so/********************************"
}
アイテム ( ページ ) のプロパティの形式については以下の公式リファレンスをご参照ください。
データベースのアイテムを更新する
次のエンドポイントに PATCH
リクエストを送信することで特定のアイテム ( ページ ) を更新することができます。
https://api.notion.com/v1/pages/<ページID>
まず更新したいアイテム ( ページ ) の URL を取得します。
データベース内のアイテムをクリックします。
右上の三点リーダ → Copy link
をクリックして URL を取得します。
アイテム ( ページ ) の URL は次のような形式になっています。
ページID
が必要になるため、ひかえておきます。
https://www.notion.so/<ページ名>-<ページID>
次のコマンドは curl
を使用してアイテムの status
型の Status
プロパティを In progress
に更新する例です。
$ curl -X PATCH 'https://api.notion.com/v1/pages/<ページID>' \
-H 'Authorization: Bearer <Integrationトークン>' \
-H 'Content-Type: application/json' \
-H 'Notion-Version: 2022-06-28' \
--data '{
"properties": {
"Status": {
"status": { "name": "In progress" }
}
}
}'
出力例
{
"object": "page",
"id": "********-****-****-****-************",
"created_time": "2023-02-25T01:04:00.000Z",
"last_edited_time": "2023-02-25T02:32:00.000Z",
"created_by": {
"object": "user",
"id": "********-****-****-****-************"
},
"last_edited_by": {
"object": "user",
"id": "********-****-****-****-************"
},
"cover": null,
"icon": null,
"parent": {
"type": "database_id",
"database_id": "********-****-****-****-************"
},
"archived": false,
"properties": {
"Status": {
"id": "****",
"type": "status",
"status": {
"id": "********-****-****-****-************",
"name": "In progress",
"color": "blue"
}
},
"Assign": {
"id": "******",
"type": "people",
"people": []
},
"Name": {
"id": "title",
"type": "title",
"title": [
{
"type": "text",
"text": {
"content": "Card 1",
"link": null
},
"annotations": {
"bold": false,
"italic": false,
"strikethrough": false,
"underline": false,
"code": false,
"color": "default"
},
"plain_text": "Card 1",
"href": null
}
]
}
},
"url": "https://www.notion.so/Card-1-********************************"
}
アイテム ( ページ ) のプロパティの形式については以下の公式リファレンスをご参照ください。
参考
Discussion