Gathering detailed insights and metrics for @notionhq/client
Gathering detailed insights and metrics for @notionhq/client
Gathering detailed insights and metrics for @notionhq/client
Gathering detailed insights and metrics for @notionhq/client
notion-blocks-react-renderer
React Renderer for @notionhq/client blocks
@benlorantfy/notion-types
This package is to cover the typings of `@notionhq/client@0.4`.
@hibernationit/notion2component
You can render the contents of the Notion Page in react using the @notionhq/client
notion2nextjs
You can render the contents of the Notion Page in react using the @notionhq/client
npm install @notionhq/client
Typescript
Module System
Min. Node Version
Node Version
NPM Version
TypeScript (99.49%)
JavaScript (0.35%)
Shell (0.16%)
Total Downloads
0
Last Day
0
Last Week
0
Last Month
0
Last Year
0
MIT License
5,277 Stars
369 Commits
654 Forks
111 Watchers
6 Branches
76 Contributors
Updated on Jul 15, 2025
Latest Version
4.0.1
Package Id
@notionhq/client@4.0.1
Unpacked Size
689.88 kB
Size
104.06 kB
File Count
40
NPM Version
10.9.2
Node Version
22.13.1
Published on
Jul 10, 2025
Cumulative downloads
Total Downloads
Last Day
0%
NaN
Compared to previous day
Last Week
0%
NaN
Compared to previous week
Last Month
0%
NaN
Compared to previous month
Last Year
0%
NaN
Compared to previous year
npm install @notionhq/client
Use Notion's Getting Started Guide to get set up to use Notion's API.
Import and initialize a client using an integration token or an OAuth access token.
1const { Client } = require("@notionhq/client") 2 3// Initializing a client 4const notion = new Client({ 5 auth: process.env.NOTION_TOKEN, 6})
Make a request to any Notion API endpoint.
See the complete list of endpoints in the API reference.
1;(async () => { 2 const listUsersResponse = await notion.users.list({}) 3})()
Each method returns a Promise
which resolves the response.
1console.log(listUsersResponse)
{
results: [
{
object: 'user',
id: 'd40e767c-d7af-4b18-a86d-55c61f1e39a4',
type: 'person',
person: {
email: 'avo@example.org',
},
name: 'Avocado Lovelace',
avatar_url: 'https://secure.notion-static.com/e6a352a8-8381-44d0-a1dc-9ed80e62b53d.jpg',
},
...
]
}
Endpoint parameters are grouped into a single object. You don't need to remember which parameters go in the path, query, or body.
1const myPage = await notion.databases.query({ 2 database_id: "897e5a76-ae52-4b48-9fdf-e71f5945d1af", 3 filter: { 4 property: "Landmark", 5 rich_text: { 6 contains: "Bridge", 7 }, 8 }, 9})
If the API returns an unsuccessful response, the returned Promise
rejects with a APIResponseError
.
The error contains properties from the response, and the most helpful is code
. You can compare code
to the values in the APIErrorCode
object to avoid misspelling error codes.
1const { Client, APIErrorCode } = require("@notionhq/client") 2 3try { 4 const notion = new Client({ auth: process.env.NOTION_TOKEN }) 5 const myPage = await notion.databases.query({ 6 database_id: databaseId, 7 filter: { 8 property: "Landmark", 9 rich_text: { 10 contains: "Bridge", 11 }, 12 }, 13 }) 14} catch (error) { 15 if (error.code === APIErrorCode.ObjectNotFound) { 16 // 17 // For example: handle by asking the user to select a different database 18 // 19 } else { 20 // Other error handling code 21 console.error(error) 22 } 23}
The client emits useful information to a logger. By default, it only emits warnings and errors.
If you're debugging an application, and would like the client to log response bodies, set the logLevel
option to LogLevel.DEBUG
.
1const { Client, LogLevel } = require("@notionhq/client") 2 3const notion = new Client({ 4 auth: process.env.NOTION_TOKEN, 5 logLevel: LogLevel.DEBUG, 6})
You may also set a custom logger
to emit logs to a destination other than stdout
. A custom logger is a function which is called with 3 parameters: logLevel
, message
, and extraInfo
. The custom logger should not return a value.
The Client
supports the following options on initialization. These options are all keys in the single constructor parameter.
Option | Default value | Type | Description |
---|---|---|---|
auth | undefined | string | Bearer token for authentication. If left undefined, the auth parameter should be set on each request. |
logLevel | LogLevel.WARN | LogLevel | Verbosity of logs the instance will produce. By default, logs are written to stdout . |
timeoutMs | 60_000 | number | Number of milliseconds to wait before emitting a RequestTimeoutError |
baseUrl | "https://api.notion.com" | string | The root URL for sending API requests. This can be changed to test with a mock server. |
logger | Log to console | Logger | A custom logging function. This function is only called when the client emits a log that is equal or greater severity than logLevel . |
agent | Default node agent | http.Agent | Used to control creation of TCP sockets. A common use is to proxy requests with https-proxy-agent |
This package contains type definitions for all request parameters and responses, as well as some useful sub-objects from those entities.
Because errors in TypeScript start with type any
or unknown
, you should use
the isNotionClientError
type guard to handle them in a type-safe way. Each
NotionClientError
type is uniquely identified by its error.code
. Codes in
the APIErrorCode
enum are returned from the server. Codes in the
ClientErrorCode
enum are produced on the client.
1try { 2 const response = await notion.databases.query({ 3 /* ... */ 4 }) 5} catch (error: unknown) { 6 if (isNotionClientError(error)) { 7 // error is now strongly typed to NotionClientError 8 switch (error.code) { 9 case ClientErrorCode.RequestTimeout: 10 // ... 11 break 12 case APIErrorCode.ObjectNotFound: 13 // ... 14 break 15 case APIErrorCode.Unauthorized: 16 // ... 17 break 18 // ... 19 default: 20 // you could even take advantage of exhaustiveness checking 21 assertNever(error.code) 22 } 23 } 24}
There are several type guards provided to distinguish between full and partial API responses.
Type guard function | Purpose |
---|---|
isFullPage | Determine whether an object is a full PageObjectResponse |
isFullBlock | Determine whether an object is a full BlockObjectResponse |
isFullDatabase | Determine whether an object is a full DatabaseObjectResponse |
isFullPageOrDatabase | Determine whether an object is a full PageObjectResponse or DatabaseObjectResponse |
isFullUser | Determine whether an object is a full UserObjectResponse |
isFullComment | Determine whether an object is a full CommentObjectResponse |
Here is an example of using a type guard:
1const fullOrPartialPages = await notion.databases.query({ 2 database_id: "897e5a76-ae52-4b48-9fdf-e71f5945d1af", 3}) 4for (const page of fullOrPartialPages.results) { 5 if (!isFullPageOrDatabase(page)) { 6 continue 7 } 8 // The page variable has been narrowed from 9 // PageObjectResponse | PartialPageObjectResponse | DatabaseObjectResponse | PartialDatabaseObjectResponse 10 // to 11 // PageObjectResponse | DatabaseObjectResponse. 12 console.log("Created at:", page.created_time) 13}
This package also exports a few utility functions that are helpful for dealing with any of our paginated APIs.
iteratePaginatedAPI(listFn, firstPageArgs)
This utility turns any paginated API into an async iterator.
Parameters:
listFn
: Any function on the Notion client that represents a paginated API (i.e. accepts
start_cursor
.) Example: notion.blocks.children.list
.firstPageArgs
: Arguments that should be passed to the API on the first and subsequent calls
to the API, for example a block_id
.Returns:
An async iterator over results from the API.
Example:
1for await (const block of iteratePaginatedAPI(notion.blocks.children.list, { 2 block_id: parentBlockId, 3})) { 4 // Do something with block. 5}
collectPaginatedAPI(listFn, firstPageArgs)
This utility accepts the same arguments as iteratePaginatedAPI
, but collects
the results into an in-memory array.
Before using this utility, check that the data you are dealing with is small enough to fit in memory.
Parameters:
listFn
: Any function on the Notion client that represents a paginated API (i.e. accepts
start_cursor
.) Example: notion.blocks.children.list
.firstPageArgs
: Arguments that should be passed to the API on the first and subsequent calls
to the API, for example a block_id
.Returns:
An array with results from the API.
Example:
1const blocks = await collectPaginatedAPI(notion.blocks.children.list, { 2 block_id: parentBlockId, 3}) 4// Do something with blocks.
This package supports the following minimum versions:
node >= 18
typescript >= 4.5
Earlier versions may still work, but we encourage people building new applications to upgrade to the current stable.
If you want to submit a feature request for Notion's API, or are experiencing any issues with the API platform, please email us at developers@makenotion.com
.
To report issues with the SDK, it is possible to submit an issue to this repo. However, we don't monitor these issues very closely. We recommend you reach out to us at developers@makenotion.com
instead.
No vulnerabilities found.
Reason
no dangerous workflow patterns detected
Reason
28 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Reason
all changesets reviewed
Reason
no binaries found in the repo
Reason
license file detected
Details
Reason
0 existing vulnerabilities detected
Reason
detected GitHub workflow tokens with excessive permissions
Details
Reason
dependency not pinned by hash detected -- score normalized to 0
Details
Reason
no effort to earn an OpenSSF best practices badge detected
Reason
security policy file not detected
Details
Reason
project is not fuzzed
Details
Reason
SAST tool is not run on all commits -- score normalized to 0
Details
Score
Last Scanned on 2025-07-07
The Open Source Security Foundation is a cross-industry collaboration to improve the security of open source software (OSS). The Scorecard provides security health metrics for open source projects.
Learn More