Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
4 years ago
Solved

connecting notion database

Hi, I'm trying to find a REST API solution to allow Notion database connection to MS Power BI via Power Query. So far, I'm only able to generate JSON file from a Notion dbase that I import in MS ...
  • ImkeF's avatar
    4 years ago

    Hi Anonymous ,
    the devil lies in the detail here: When I use the GET request from my PQ query in Postman I get the same result than in PQ: Empty email and name.
    However, I missed that you were using a POST-request instead. You can convert the PQ GET request to a post request by adding a content parameter to the record like so. I'm using page_size = 100 in the body here:

    let
    Source = Json.Document(Web.Contents("https://api.notion.com/v1/databases/4db1bc42bf2b4e1a81b6c7056b41321d/query", [Headers=[Authorization="secret_hc4P70yKhZeK8xbzTsAaLgLeTUYPBmXZ6zDsH09bia5", #"Notion-Version"="2022-02-22"], Content = Json.FromValue([page_size=100])])),
        results = Source[results],
        #"Converted to Table" = Table.FromList(results, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
        #"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"object", "id", "created_time", "last_edited_time", "created_by", "last_edited_by", "cover", "icon", "parent", "archived", "properties", "url"}, {"object", "id", "created_time", "last_edited_time", "created_by", "last_edited_by", "cover", "icon", "parent", "archived", "properties", "url"}),
        #"Expanded properties" = Table.ExpandRecordColumn(#"Expanded Column1", "properties", {"Mood", "Email", "Name"}, {"Mood", "Email", "Name"}),
        #"Expanded Email" = Table.ExpandRecordColumn(#"Expanded properties", "Email", {"id", "type", "email"}, {"id.1", "type", "email.1"}),
        #"Expanded Name" = Table.ExpandRecordColumn(#"Expanded Email", "Name", {"id", "type", "title"}, {"id.2", "type.1", "title"})
    in
        #"Expanded Name"

     

    The reason for the different result is probably that email and name are complex fields, as they are separate database objects themselves.

  • ImkeF's avatar
    4 years ago

    Hi Anonymous ,

    sure. This is an example where the next cursor info has to be passed in the body:

    let
        Source = Json.Document(
            Web.Contents(
                "https://api.notion.com/v1/databases/4db1bc42bf2b4e1a81b6c7056b41321d/query",
                [
                    Headers = [
                        Authorization     = "secret_hc4P70yKhZeK8xbzTsAaLgLeTUYPBmXZ6zDsH09bia5",
                        #"Notion-Version" = "2022-02-22",
                        #"Content-Type"   = "application/json"
                    ],
                    Content = Json.FromValue([page_size = 20])
                ]
            )
        ),
        Custom1 = List.Generate(
            () => [Result = Source, prevHasMore = true],
            each [prevHasMore] = true,
            each [
                prevHasMore = [Result][has_more],
                Result = Json.Document(
                    Web.Contents(
                        "https://api.notion.com/v1/databases/4db1bc42bf2b4e1a81b6c7056b41321d/query",
                        [
                            Headers = [
                                Authorization     = "secret_hc4P70yKhZeK8xbzTsAaLgLeTUYPBmXZ6zDsH09bia5",
                                #"Notion-Version" = "2022-02-22",
                                #"Content-Type"   = "application/json"
                            ],
                            Content = Json.FromValue(
                                [page_size = 20, start_cursor = [Result][next_cursor]]
                            )
                        ]
                    )
                )
            ]
        ),
        #"Converted to Table" = Table.FromList(
            Custom1,
            Splitter.SplitByNothing(),
            null,
            null,
            ExtraValues.Error
        ),
        #"Expanded Column1" = Table.ExpandRecordColumn(
            #"Converted to Table",
            "Column1",
            {"Result"},
            {"Column1.Result"}
        ),
        #"Expanded Column1.Result" = Table.ExpandRecordColumn(
            #"Expanded Column1",
            "Column1.Result",
            {"object", "results", "next_cursor", "has_more", "type", "page"},
            {"object", "results", "next_cursor", "has_more", "type", "page"}
        ),
        #"Expanded results" = Table.ExpandListColumn(#"Expanded Column1.Result", "results")
    in
        #"Expanded results"

     

    With a page size of 20 and 110 total rows, it runs 6 times to get the total result.
    Please note that I've had to add a Content-Type parameter to the header.
    If you're wondering about the "prevHasMore"-field, you can read more about it here: How not to miss the last page when paging with Power BI and Power Query (thebiccountant.com)