Skip to content

Notion

Integration with the Notion REST API (base URL https://api.notion.com/v1). Six nodes cover the day-to-day work of a workspace: create a page (as a database row or as a subpage), read a page by its id, update its properties or archive it, query a database with filters and sorting, append content blocks, and add a comment.

Authentication is handled through the credentials module (service type notion): a Bearer token plus the mandatory Notion-Version header, which every request sends automatically (default 2022-06-28).

Each node exposes only the fields it needs. This is the combined list across the six nodes:

ParameterTypeRequiredDescription
credentials_idcredentialsYesNotion credential (provider notion)
database_idtextConditionalDatabase id — parent on Create Page, target on Query Database
parent_page_idtextConditionalParent page id on Create Page, when the parent is not a database
page_idtextConditionalPage id — Get Page, Update Page and Add Comment
block_idtextConditionalParent page or block id — Append Content
propertiesjsonConditionalTyped page properties in Notion format
childrenjsonNoArray of content blocks (Notion format)
filterjsonNoQuery filter (Notion format)
sortsjsonNoSort array (Notion format)
page_sizenumberNoMaximum results per query (1-100)
texttextareaConditionalPlain text — comment body, or paragraph to append
archivedtextNotrue archives the page, false restores it

Service type: notion. Stored in the servicecredentials table.

  • token: the Internal Integration Secret from notion.so/my-integrations. Required.
  • notion_version: value sent in the Notion-Version header (default: 2022-06-28). Optional.
  • timeout: request timeout in milliseconds (default: 20000). Optional.

The Test button calls GET /users/me and returns the name of the integration.

In Notion, the properties of a page are typed objects that depend on the column type (title, rich_text, select, date, number, relation, and so on). That is why properties, filter and sorts are JSON fields in Notion’s own format. A title looks like this:

{ "Name": { "title": [ { "text": { "content": "New lead" } } ] } }
{
"nextModule": null,
"data": {
"object": "page",
"id": "8b9c0d1e-2f3a-4b5c-6d7e-8f9a0b1c2d3e",
"url": "https://www.notion.so/8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e",
"properties": {
"Name": { "title": [ { "text": { "content": "New lead" } } ] }
}
},
"_meta": {
"moduleVersion": "1.0.0",
"success": true,
"id": "8b9c0d1e-2f3a-4b5c-6d7e-8f9a0b1c2d3e",
"url": "https://www.notion.so/8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e",
"totalMs": 340
}
}

Query Database is the exception: its data is the array of pages (results), and _meta carries count, has_more and next_cursor.

  • Notion REST API — https://developers.notion.com/reference/intro
  • Base URL: https://api.notion.com/v1
  • Endpoints: POST /pages, GET /pages/{id}, PATCH /pages/{id}, POST /databases/{id}/query, PATCH /blocks/{id}/children, POST /comments
  • The Notion-Version header is mandatory on every call. The nodes send 2022-06-28 unless the credential sets another value.
  • Text and id fields accept dynamic variables such as {{data.email}}, including inside the JSON fields.
  • Transient failures (timeout, 429 rate limit, 409 conflict, 5xx and network errors) are retried automatically up to 3 times with exponential backoff, honouring the Retry-After header.
  • Validation errors (400), authentication errors (401/403) and not found (404) are not retried: fix the JSON, the credential or the sharing settings.
  • Notion caps page_size at 100. Use next_cursor from _meta to walk long databases.
  • Default request timeout is 20 seconds.
  • For endpoints not covered by these six nodes (search, users, retrieve blocks…), use the HTTP node with the same credential values.