Resources/The Agent API Atlas/Productivity/Notion

Everything an AI agent can do with the Notion API.

A reference guide for building AI agents: every method, how to authenticate, and the permissions each one needs.

Endpoints37
API version2026-03-11
Last updated21 June 2026
Orientation

How the Notion API works.

The Notion API is how an app or AI agent works with a Notion workspace: reading and writing pages, querying database rows, editing the content blocks on a page, adding comments, and uploading files. Access is granted through a token and a set of permissions, and a connection only ever sees the pages and databases that have been shared with it. Versions are dated rather than numbered, so an older integration keeps working on its pinned date until it moves up.

37Endpoints
9Capability groups
19Read
18Write
6Permissions
Authentication
Every request carries a Bearer token. Internal integrations use one static token; public integrations get a token per workspace through OAuth.
Permissions
Permissions work in two layers. An integration sees only what's shared with it, and then capability toggles, like read, insert, update and comments, gate what it can do.
Versioning
Versions are dated rather than numbered, so an integration pins a version like 2026-03-11. A new version appears only for a breaking change, so additive features ship without one.
Data model
The data model covers pages, blocks, databases and the data sources inside them, plus comments, users and files. Since 2025-09-03, rows live on a data source.
Connect & authenticate

Connection & authentication methods.

An app or AI agent connects to Notion in one of two ways, each with its own token type: direct REST calls, or Notion's hosted MCP server. The connection method does not change an integration's reach, because either way it sees only what's been shared with it and is bound by the same capabilities.

Ways to connect

REST API

An app or AI agent makes direct HTTPS calls to the endpoints in this reference.

Best forCustom integrations that want full control over each request.
Governed byA connection token plus capabilities; the connection sees only what's shared with it.
Docs ↗

Hosted MCP server

Notion hosts a remote Model Context Protocol server at https://mcp.notion.com/mcp that exposes Notion as standard tools to MCP-aware agents over Streamable HTTP.

Best forAgents and assistants that speak MCP and want tool-calling without writing raw HTTP.
Governed byNotion's OAuth flow (PKCE; access tokens expire after about an hour). The agent sees only what's shared with the authorising user and is bound by the same capabilities as the REST API.
Docs ↗
Authentication

Internal integration

A fixed token generated for a single workspace lets the integration act as a bot identity.

TokenBearer token (static).
Best forIn-house agents acting in their own workspace.
Docs ↗

Public integration

A public integration is distributed to other workspaces and gets a token per workspace through an OAuth consent flow, acting on behalf of the authorising user.

TokenBearer token (per workspace, via OAuth).
Best forProducts that connect their customers' Notion.
Docs ↗

Personal access token

A personal access token is tied to one user and acts as that user, with the user's own permissions.

TokenBearer token (static, user-scoped).
Best forPersonal automation acting as the user, rather than as a separate bot.
Docs ↗
Capability map

What an AI agent can do in Notion.

Notion divides its API into functional areas, and each one is a place an agent can act. Each area carries its own permissions, and some reach further into a workspace than others.

Pages

4 endpoints

Read, create, and update pages and their property values.

Creating and editing pages changes real content, so write access reaches whatever an agent is allowed to edit.
View endpoints

Databases & data sources

8 endpoints

Read a database's structure and query the rows inside it. The rows live on its data sources.

A data source's schema controls every row in it, so editing the schema can drop columns and change all of those rows at once.
View endpoints

Blocks (content)

6 endpoints

Read, add, edit, and remove the content blocks that make up a page.

Deleting a block removes its nested content too. The content is recoverable from Trash, but the deletion still removes it from the page.
View endpoints

Search

1 endpoint

Find pages and databases across everything shared with the connection.

Search reaches across everything shared with the connection at once, so it can surface an item that was shared narrowly.
View endpoints

Comments

2 endpoints

Read existing comments and add new ones to pages and blocks.

Comments are visible to everyone with access to the page, so anything an agent posts is visible to that whole audience.
View endpoints

People

3 endpoints

Look up the workspace's members and bots.

The people directory returns everyone's names, and their email addresses too if the email level is granted.
View endpoints

Files

5 endpoints

Upload files so they can be attached to pages, blocks, or properties.

Uploaded files become workspace content, so they take on the access of wherever they're attached.
View endpoints

Views

5 endpoints

Create and manage saved views, like tables, boards and calendars, of a data source.

Views change how data is presented, not who can see it, so a view does not widen what an agent is already allowed to access.
View endpoints

Authentication

3 endpoints

OAuth endpoints used to connect a workspace and manage a connection's token.

These endpoints manage the connection itself, so they run during setup rather than during an agent's day-to-day work.
View endpoints
Endpoint reference

Every Notion API endpoint.

Filter by method, access, or permission, or search any path. Select a row for version detail, rate limits, the related webhook event, and the source.

MethodEndpointWhat it doesAccessPermissionVersion

Pages

Read, create, and update pages and their property values.4

Creates one page or row under one shared parent.

Acts onpage
Permission (capability)insert_content
VersionAvailable since the API’s base version
Webhook eventpage.created
Rate limitStandard limits apply

Reads one page's properties, not its block content.

Acts onpage
Permission (capability)read_content
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Reads one property of one page; the correct way to page through large or multi-value properties.

Acts onpage property
Permission (capability)read_content
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Edits one page and can archive it. Cannot move it to a new parent; erase_content is irreversible.

Acts onpage
Permission (capability)update_content
VersionAvailable since the API’s base version
Webhook eventpage.properties_updated
Rate limitStandard limits apply

Databases & data sources

Read a database's structure and query the rows inside it. The rows live on its data sources.8

Reads rows from one shared data source. Replaces the legacy database query.

Acts ondata source
Permission (capability)read_content
VersionIntroduced 2025-09-03
Webhook eventNone
Rate limitResults cap at 10,000 per query.

Reads the column definitions of one data source; no rows.

Acts ondata source
Permission (capability)read_content
VersionIntroduced 2025-09-03
Webhook eventNone
Rate limitStandard limits apply

Adds one schema/table to a shared database.

Acts ondata source
Permission (capability)insert_content
VersionIntroduced 2025-09-03
Webhook eventdata_source.created
Rate limitStandard limits apply

Changes a data source's columns; dropping a column affects every row in it.

Acts ondata source
Permission (capability)update_content
VersionIntroduced 2025-09-03
Webhook eventdata_source.schema_updated
Rate limitStandard limits apply

Creates one database (and its first data source) under a shared page.

Acts ondatabase
Permission (capability)insert_content
VersionAvailable since the API’s base version
Webhook eventdatabase.created
Rate limitStandard limits apply

Reads a database's metadata and its child data sources; not the schema or rows.

Acts ondatabase
Permission (capability)read_content
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Edits container-level settings of one database; the schema lives on its data source.

Acts ondatabase
Permission (capability)update_content
VersionAvailable since the API’s base version
Webhook eventdatabase.moved
Rate limitStandard limits apply

Deprecated in 2025-09-03; superseded by Query a data source.

Acts ondatabase
Permission (capability)read_content
VersionDeprecated 2025-09-03
Webhook eventNone
Rate limitStandard limits apply

Blocks (content)

Read, add, edit, and remove the content blocks that make up a page.6

Reads one block; does not return its children.

Acts onblock
Permission (capability)read_content
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Lists one level of children; nested content needs further calls.

Acts onblock
Permission (capability)read_content
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Adds new blocks under one parent (up to 100 per call); does not edit existing blocks.

Acts onblock
Permission (capability)insert_content
VersionAvailable since the API’s base version
Webhook eventpage.content_updated
Rate limitStandard limits apply

Edits one block, replacing the fields sent; its children aren't changed.

Acts onblock
Permission (capability)update_content
VersionAvailable since the API’s base version
Webhook eventpage.content_updated
Rate limitStandard limits apply

Archives one block and its nested children; recoverable from Trash.

Acts onblock
Permission (capability)update_content
VersionAvailable since the API’s base version
Webhook eventpage.content_updated
Rate limitStandard limits apply

Reads meeting-notes blocks the connection can access.

Acts onblock
Permission (capability)read_content
VersionIntroduced 2026-05-11
Webhook eventNone
Rate limitStandard limits apply
Find pages and databases across everything shared with the connection.1

Searches everything shared with the connection, bounded to shared items, but workspace-wide in reach.

Acts onpage, data source
Permission (capability)read_content
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitSubject to a query result limit; signalled via request_status.

Comments

Read existing comments and add new ones to pages and blocks.2

Adds one comment to a shared page, block, or thread.

Acts oncomment
Permission (capability)insert_comments
VersionAvailable since the API’s base version
Webhook eventcomment.created
Rate limitStandard limits apply

Lists un-resolved comments on one page or block.

Acts oncomment
Permission (capability)read_comments
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

People

Look up the workspace's members and bots.3

Returns the whole member directory; emails only if the with-email level is granted.

Acts onuser
Permission (capability)user_info
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Reads one user's profile; email only with the with-email level.

Acts onuser
Permission (capability)user_info
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Returns the connection's own identity; needs no specific capability.

Acts onuser
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Files

Upload files so they can be attached to pages, blocks, or properties.5

Begins an upload; the file isn't attached anywhere until it's attached.

Acts onfile upload
Permission (capability)insert_content
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Sends file contents for a pending upload (multipart form data).

Acts onfile upload
Permission (capability)insert_content
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Finalises a multi-part upload after all parts are sent.

Acts onfile upload
Permission (capability)insert_content
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Reads the status of one upload.

Acts onfile upload
Permission (capability)read_content
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Lists uploads created by the connection.

Acts onfile upload
Permission (capability)read_content
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Views

Create and manage saved views, like tables, boards and calendars, of a data source.5

Creates one saved view of a data source; requires insert and update content.

Acts onview
Permission (capability)insert_content
VersionIntroduced 2026-03-19
Webhook eventview.created
Rate limitStandard limits apply

Reads one view's configuration.

Acts onview
Permission (capability)read_content
VersionIntroduced 2026-03-19
Webhook eventNone
Rate limitStandard limits apply

Edits one view's presentation; doesn't change who can see the underlying data.

Acts onview
Permission (capability)update_content
VersionIntroduced 2026-03-19
Webhook eventview.updated
Rate limitStandard limits apply

Removes one saved view (a dedicated reference page was not confirmed at last verify).

Acts onview
Permission (capability)update_content
VersionIntroduced 2026-03-19
Webhook eventview.deleted
Rate limitStandard limits apply

Lists the views belonging to one database.

Acts onview
Permission (capability)read_content
VersionIntroduced 2026-03-19
Webhook eventNone
Rate limitStandard limits apply

Authentication

OAuth endpoints used to connect a workspace and manage a connection's token.3

Used during connection setup; authenticates with client credentials, not a Notion capability.

Acts ontoken
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Validates a stored token without making a data call.

Acts ontoken
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Invalidates a connection's token.

Acts ontoken
Permission (capability)None required
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply
No endpoints match those filters.
Webhooks

Webhook events.

Notion delivers a lightweight signal that carries the event name and the affected object's ID rather than its content, so the object is re-fetched through the API. Subscriptions are set up inside Notion itself, not through an endpoint.

EventWhat it signalsTriggered by
page.createdFires when a page (or database row) is created./v1/pages
page.content_updatedFires when a page's block content changes (aggregated within a short window)./v1/blocks/{id}/children
/v1/blocks/{id}
/v1/blocks/{id}
page.properties_updatedFires when a page's property values change./v1/pages/{id}
page.deletedFires when a page is moved to Trash./v1/pages/{id}
page.undeletedFires when a page is restored from Trash./v1/pages/{id}
page.lockedFires when a page is locked./v1/pages/{id}
page.unlockedFires when a page is unlocked./v1/pages/{id}
page.movedFires when a page is moved to a new parent (no REST endpoint moves a page; this comes from in-app moves).In-app only
database.createdFires when a database is created./v1/databases
database.movedFires when a database is moved to a new parent./v1/databases/{id}
database.deletedFires when a database is moved to Trash./v1/databases/{id}
database.undeletedFires when a database is restored from Trash./v1/databases/{id}
data_source.createdFires when a data source is added to a database./v1/data_sources
data_source.content_updatedFires when the rows of a data source change./v1/pages
/v1/pages/{id}
data_source.schema_updatedFires when a data source's columns (schema) change./v1/data_sources/{id}
data_source.movedFires when a data source is moved to a new parent./v1/data_sources/{id}
data_source.deletedFires when a data source is moved to Trash./v1/data_sources/{id}
data_source.undeletedFires when a data source is restored from Trash./v1/data_sources/{id}
comment.createdFires when a comment is added./v1/comments
comment.updatedFires when a comment is edited (no REST endpoint edits a comment; this comes from in-app edits).In-app only
comment.deletedFires when a comment is deleted (no REST endpoint deletes a comment; this comes from in-app deletes).In-app only
view.createdFires when a view is created./v1/views
view.updatedFires when a view's settings change./v1/views/{id}
view.deletedFires when a view is deleted./v1/views/{id}
No events match that search.
Rate limits & pagination

Rate limits, pagination & request size.

Several constraints shape any Notion integration, covering how often it can call, how it pages through results, and how large a single request can be. Limits tied to a single endpoint appear in that row's detail in the reference above.

Request rate

Each connection gets about 3 requests per second on average, with short bursts allowed above that. A separate per-workspace pool sits on top, and the size of that pool scales with the plan. Going over returns 429 rate_limited with a Retry-After header that gives the number of seconds to wait. A 529 service_overload is handled the same way, by backing off and retrying.

Pagination

Results are paged through with opaque cursors. A request sends page_size (the default and maximum is 100) and start_cursor, and the response returns results, has_more and next_cursor. Query endpoints also stop at 10,000 results, signalled by request_status.incomplete_reason set to query_result_limit_reached.

Request size

A request holds up to 1,000 block elements or 500 KB. Rich text and URLs cap at 2,000 characters; block, relation and people arrays at 100 items each; multi-select at 100 options.

Errors

Status codes & error handling.

The status codes an agent should handle, and what to do about each.

StatusCodeMeaningWhat to do
400validation_errorThe request body or parameters were malformed or failed validation.Check the request against the endpoint's schema: property names, types and required fields.
400missing_versionThe request did not include a Notion-Version header.Send a Notion-Version header on every request, for example 2026-03-11.
401unauthorizedThe token is missing, malformed or invalid.Confirm the Authorization header carries a valid Bearer token, and refresh or reconnect if it has expired or been revoked.
403restricted_resourceThe connection lacks the capability needed for this action.Grant the required capability (read, insert, update, comments or user information) on the integration.
404object_not_foundThe object doesn't exist, or it exists but isn't shared with the connection. Notion deliberately makes the two cases indistinguishable.Check the ID, and confirm the page or database is shared with the integration.
409conflict_errorThe transaction could not be completed, usually because of a concurrent edit.Retry the request.
429rate_limitedToo many requests.Honour the Retry-After header, which is in seconds, and back off before retrying.
529service_overloadNotion is temporarily overloaded.Back off and retry, the same way as for a 429.
Versioning & freshness

Version history.

Notion issues a new version only when a change breaks backwards compatibility, and new features ship continuously on the current version. This timeline shows both the versions that may require a migration and the features added since.

Version history

What changed, and when

Latest version2026-03-11
2026-06-16Feature update
Workspace-level rate limits

This version adds a per-workspace request pool on top of the per-connection rate limit.

What changed
  • New: a per-workspace request pool, whose size scales with the plan, applies in addition to the ~3 req/s per-connection limit.
  • Going over the limit still returns 429 rate_limited with a Retry-After header.
  • Additive: shipped on the current version, with no new version minted.
2026-05-12Feature update
Developer portal & PATs

This version launches the developer portal and personal access tokens.

What changed
  • New: personal access tokens (PATs) that act as the user who created them.
  • New developer portal for managing integrations.
  • Additive: shipped on the current version, with no new version minted.
2026-05-11Feature update
Meeting-notes query

This version adds an endpoint to query meeting-notes blocks, plus an agent parent type.

What changed
  • New: POST /v1/blocks/meeting_notes/query.
  • New parent type: agent_id.
  • Additive: shipped on the current version, with no new version minted.
2026-04-20Feature update
10,000-result query cap

This version caps query endpoints at 10,000 results.

Migrate: If a query may exceed 10,000 rows, narrow it with filters rather than paging to the end.
What changed
  • Query endpoints stop at 10,000 results.
  • Truncation is signalled by request_status.incomplete_reason set to query_result_limit_reached.
  • Additive: shipped on the current version, with no new version minted.
2026-04-17Feature update
Comment update & delete

This version brings the update and delete comment endpoints to general availability, plus multi-value select filters.

What changed
  • New: update and delete comment endpoints, now generally available.
  • New: multi-value filters on select properties.
  • Additive: shipped on the current version, with no new version minted.
2026-03-19Feature update
Views API

This version adds endpoints and webhooks for saved views, plus status-property writes.

What changed
  • New: create, retrieve, update, delete and list views (8 endpoints).
  • New webhooks: view.created, view.updated, view.deleted.
  • Status properties can now be written through the API.
  • Additive: shipped on the current version, with no new version minted.
2026-03-11Current version
Trash and meeting-notes renames

This version renames several fields and a block type, and it is the current version an integration pins.

Migrate: Update calls that send 'after' or 'archived', and any handling of the 'transcription' block type, before pinning this version.
What changed
  • Append block children: 'after' is replaced by 'position'.
  • 'archived' is replaced by 'in_trash' everywhere.
  • The block type 'transcription' is renamed to 'meeting_notes'.
2026-02-26Feature update
Markdown content API

This version adds endpoints to create, read and update page content as Markdown.

What changed
  • New: create, read and update page content as Markdown.
  • Adds AI meeting-notes support.
  • Additive: shipped on the current version, with no new version minted.
2025-09-03Requires migration
Data sources model

This version makes a database a container that can hold multiple data sources, and rows now live on the data source.

Migrate: Resolve a database's data source or sources and query those instead of the database; move row creation to the data_source_id parent.
What changed
  • New: data_sources endpoints (query, retrieve, create, update).
  • New webhooks: data_source.created, data_source.schema_updated and related events.
  • Deprecated: POST /v1/databases/{id}/query. Use the data-source query instead.
  • Pages can now be parented to a data source (data_source_id).
Earlier
Earlier versions

Pre-2025 versions covered page property-item reads, block parents, relation single and dual properties (2022-06-28), and rollup and rich-text renames (2021).

Migrate: An integration still pinned to a pre-2025 version migrates through the data-sources model (2025-09-03) to reach current; see the full changelog.
What changed
  • 2022-06-28: page property-item endpoint; parent on blocks; single and dual relation properties.
  • 2021-08-16 / 2021-05-13: rollup and rich-text renames; property ID encoding.

Older versions keep working. An integration pins one with the Notion-Version header and moves up on its own schedule.

Notion's full changelog ↗
Questions

Notion API, answered.

How does a Notion integration get access to my pages?+
Access is granted explicitly. A workspace member shares a page or database with the integration (or, for a public integration, authorises it through OAuth), and the integration then sees only those items plus anything nested under them. What it can do with them is limited further by its capabilities, which are separate toggles for reading, inserting and updating content.
What's the difference between an internal and a public integration?+
An internal integration has a single static token and works in one workspace, which suits in-house automation. A public integration is distributed to other workspaces and receives a token per workspace through an OAuth consent flow, which fits connecting a customer's Notion. There is also a personal access token (PAT), which acts as the user who created it.
Why did POST /v1/databases/{id}/query stop working?+
It was deprecated in the 2025-09-03 version, when a database became a container that can hold multiple data sources. Rows now live on a data source, so the query goes to the data source instead with POST /v1/data_sources/{id}/query. See Query a data source.
How should an agent handle a 429 rate_limited response?+
An agent honours the Retry-After header, which gives the number of seconds to wait, then backs off and retries. A 529 service_overload is handled the same way. Notion allows roughly 3 requests per second per connection on average, with short bursts above that.
Can a Notion integration see my whole workspace?+
No. It only ever sees pages and databases that have been shared with it. The one capability to watch is search, which reaches across everything shared with the connection at once. Its reach is workspace-wide, but it stays bounded to what was shared.
Does Notion support webhooks?+
Yes. Webhooks deliver lightweight signals, an event name and the affected object's ID rather than its content, so the object is re-fetched through the API. Subscriptions are created in the Notion interface, not through a REST endpoint, which matters for automated multi-tenant onboarding.
Is there a Model Context Protocol (MCP) server for Notion?+
Yes. Notion hosts a remote MCP server at https://mcp.notion.com/mcp that exposes Notion as standard MCP tools to agents. It connects through Notion's OAuth flow and is governed by the same sharing and capabilities as the REST API. See the MCP guide.
What is Bollard AI?

Control what every AI agent can do in Notion.

Bollard AI sits between a team's AI agents and Notion. Grant each agent exactly the access it needs, read or write, database by database, and every call is checked and logged.

  • Set every database and page to Off, Read, or Full use, per person and per agent.
  • Denied by default, so an agent reaches only what's been explicitly allowed.
  • Every call recorded in plain English: who, what, where, and the decision.
Notion
Recruiter Agent
Candidates DatabaseOffReadFull use
Customers DatabaseOffReadFull use
Finance Pages & databasesOffReadFull use
Per-agent access, set in Bollard AI, not in Notion