🙆

Notion APIを使ってデータベースのデータを取得する

2024/05/25に公開

Notion API https://api.notion.com にリクエストして、自身のワークスペースのデータベースのデータを取得します。
https://developers.notion.com/

integationを作成する

https://developers.notion.com/docs/create-a-notion-integration#getting-started を参考に進めていきます。

まずはintegrationを作成する必要があるので作成します。
integration管理ページから作成します。

workspaceとNameを設定する必要があります。
Nameは今回はexample-1としました。

Submitをすると作成されたintegrationの詳細・設定画面に遷移します。

integration管理ページを見ると、integrationが作成されていることがわかります。

権限を設定

integraitonの設定画面からCapabilitiesを設定しておきます。

今回はコンテンツの取得だけを試したいので、Read contentだけ設定しておきます。

ちなみにUser Capabilitiesはユーザー情報を取得できるようにするかどうかの設定です。
https://api.notion.com/v1/usersなどでワークスペースのユーザー一覧を取得したい時に必要です。
今回は必要ないので、No user informationのままにしておきます。

取得したいデータベースをNotionに用意して権限を与える

https://developers.notion.com/docs/create-a-notion-integration#give-your-integration-page-permissions

example-データベースというデータベースを作成しました。
右上の設定のConnect toから先程作成したintegration example-1を選択してコネクトしておきます。

これでAPIを用いてこのページのデータを取得できるようになりました。

実装

データベース取得のエンドポイントは
https://api.notion.com/v1/databases/${databaseId}/queryとなります。
以下を参考に実装していきます。
https://developers.notion.com/reference/retrieve-a-page

取得するデータベースはこのようにName, Tagsの項目があるとします。

const databaseId = "b6db4592fa944c8d9a8105b9f21ce6f4";

  const response = await fetch(
    `https://api.notion.com/v1/databases/${databaseId}/query`,
    {
      method: "POST",
      headers: {
        Authorization: `Bearer ${process.env.NOTION_API_KEY}`,
        "Notion-Version": "2022-06-28",
        "Content-Type": "application/json",
      },
    }
  );

  const body = await response.json();
  console.log("body", JSON.stringify(body, null, 2));

databseIdとは、notionのデータベースのURLの
https://www.notion.so/hoge/{ここにあたる文字列がdatabseIdとなります}?v=09f13844c52e49ab95b9231d6b664521

NOTION_API_KEY
integrationページのSecretsを使用します。

APIのレスポンス

レスポンスは以下のようになります。

レスポンスボディ
{
  "object": "list",
  "results": [
    {
      "object": "page",
      "id": "3fb78f80-0271-49a7-a977-be8950da3adc",
      "created_time": "2024-05-25T02:44:00.000Z",
      "last_edited_time": "2024-05-25T02:53:00.000Z",
      "created_by": {
        "object": "user",
        "id": "75508370-7c58-4a68-be66-3508ca96df3a"
      },
      "last_edited_by": {
        "object": "user",
        "id": "75508370-7c58-4a68-be66-3508ca96df3a"
      },
      "cover": null,
      "icon": null,
      "parent": {
        "type": "database_id",
        "database_id": "b6db4592-fa94-4c8d-9a81-05b9f21ce6f4"
      },
      "archived": false,
      "in_trash": false,
      "properties": {
        "Tags": {
          "id": "%5C%3C%7Bz",
          "type": "multi_select",
          "multi_select": [
            {
              "id": "e81d3619-83d1-451e-94de-d73a271993f0",
              "name": "タグA",
              "color": "green"
            }
          ]
        },
        "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/3fb78f80027149a7a977be8950da3adc",
      "public_url": null
    },
    {
      "object": "page",
      "id": "ded13517-df92-494b-8942-7464797cc980",
      "created_time": "2024-05-25T02:44:00.000Z",
      "last_edited_time": "2024-05-25T03:07:00.000Z",
      "created_by": {
        "object": "user",
        "id": "75508370-7c58-4a68-be66-3508ca96df3a"
      },
      "last_edited_by": {
        "object": "user",
        "id": "75508370-7c58-4a68-be66-3508ca96df3a"
      },
      "cover": null,
      "icon": null,
      "parent": {
        "type": "database_id",
        "database_id": "b6db4592-fa94-4c8d-9a81-05b9f21ce6f4"
      },
      "archived": false,
      "in_trash": false,
      "properties": {
        "Tags": {
          "id": "%5C%3C%7Bz",
          "type": "multi_select",
          "multi_select": [
            {
              "id": "35779eed-b540-4cd0-bacf-bf9ae56eb09a",
              "name": "タグB",
              "color": "yellow"
            },
            {
              "id": "e81d3619-83d1-451e-94de-d73a271993f0",
              "name": "タグA",
              "color": "green"
            }
          ]
        },
        "Name": {
          "id": "title",
          "type": "title",
          "title": []
        }
      },
      "url": "https://www.notion.so/ded13517df92494b89427464797cc980",
      "public_url": null
    }
  ],
  "next_cursor": null,
  "has_more": false,
  "type": "page_or_database",
  "page_or_database": {},
  "request_id": "ba13e477-7570-49a7-89de-c471506040e4"
}

それぞれの項目については

const results = body.results;
  results.forEach((result: any, index: number) => {
    console.log("index", index);
    const name = result.properties.Name.title[0]?.plain_text;
    const tags = result.properties.Tags.multi_select.map((tag: any) => ({
      name: tag.name,
      color: tag.color,
    }));

    console.log("Name:", name);
    tags.forEach((tag: any) => {
      console.log("Tag Name:", tag.name, "Color:", tag.color);
    });
  });

このように取得することができました。

index 0
Name: あいうえお
Tag Name: タグA Color: green
index 1
Name: undefined
Tag Name: タグB Color: yellow
Tag Name: タグA Color: green

リクエスト制限

https://developers.notion.com/reference/request-limits
Notion APIを使う場合はレートリミットとリクエストパラメータのサイズの制限があるので注意が必要です。
レートリミットはだいたい秒間3リクエストほどでエラーになる可能性があるようです。

おわり

この記事が少しでも参考になれば幸いです。
励みになりますのでもしよかったらいいねお願いします🙏

Discussion