Notion API logo

Notion API

Notion API

Notion API lets external apps read and write pages and databases — used for automation, internal tools, and dashboard integrations.

Visit site ↗Health checked 9h ago
Use it when

Official JS SDK is fully typed down to property level

Watch for

Average rate limit ~3 req/s — bulk syncs hit it easily

First check

Create an internal integration at notion.so/my-integrations and copy its secret token. In Notion, share the target page or database with the integration. Then call the API with Authorization: Bearer <token> and a Notion-Version header.

Auth
oauth
CORS
No
HTTPS
Yes
Signup
Required
Latency
709 ms
Protocol
REST
Pricing
freemium

Uptime · 30-day window

Probes: 1Uptime: 100%Avg latency: 709ms
01

About this API

Notion API turns Notion into a programmable workspace: read and write pages, query and filter databases, manipulate block trees. The most common indie use case is treating Notion as a headless CMS — store blog posts, changelogs, or knowledge base entries in a database, and have your frontend pull and render via API.

Authentication comes in two flavors. Internal integrations are zero-friction for personal use — generate a token and go, no OAuth dance. Public integrations follow standard OAuth and are suitable for app-marketplace distribution. Either way, the integration must be explicitly shared with the target page or database — that's Notion's permission model.

The block model is the heart of Notion's data shape: every page is a container of blocks, and blocks can be paragraphs, headings, lists, code, child databases, and so on. Reading a page usually means fetching its metadata first, then paginating through its block tree. Rate limit averages ~3 req/s, so bulk syncs need careful pacing. A handful of property types (rollups, formulas, relations) are read-only via API; writes go through upstream fields or the UI.

02

What you can build

  • 1Use Notion as a headless CMS for a blog or marketing site
  • 2Sync data from external systems into Notion databases
  • 3Build cross-tool automations (e.g. Linear issue → Notion entry)
  • 4Generate reports or PDFs from Notion content
  • 5Power read-only dashboards or public pages
03

Strengths & limitations

Strengths

  • Official JS SDK is fully typed down to property level
  • Internal integrations are zero-friction — no OAuth redirect needed
  • Block model is expressive enough for rich text and nested structures
  • Mature community middleware (notion-to-md, etc.)

Limitations

  • Average rate limit ~3 req/s — bulk syncs hit it easily
  • Some property types are read-only (rollup, formula)
  • Page size defaults to 100; cross-page assembly is fiddly
04

Example request

Generic template — replace <endpoint> with the real path from the docs.
curl https://notion.com/<endpoint> \
  -H "Authorization: Bearer $ACCESS_TOKEN"
05

Getting started

Create an internal integration at notion.so/my-integrations and copy its secret token. In Notion, share the target page or database with the integration. Then call the API with Authorization: Bearer <token> and a Notion-Version header.

06

FAQ

Is the API paid?+

The API itself is free, but the target workspace must be on a paid Notion plan to unlock certain features like fine-grained sharing.

Why am I getting "page not found"?+

Most often the integration is not shared with that page or database. Notion permissions are granted at the integration level.

Can I modify formula fields?+

No — formula, rollup, created_by, and last_edited_by are derived/system properties and read-only via API.

How many database rows can I fetch at once?+

Default page_size is 100, max 100. Use next_cursor to paginate.

07

Technical details

CORS: NoHTTPS: YesSignup: YesOpen source: No
Auth type
oauth
Pricing
freemium
Protocols
REST
SDKs
javascript, typescript, python
Response time
709 ms
Last health check
5/12/2026, 7:37:58 AM
08

Endpoints

Parsed from the OpenAPI spec. Showing 12 of 13 non-deprecated endpoints.

DELETE
/v1/blocks/{id}Blocks

Delete a block

id:path*Notion-Version:header
GET
/v1/blocks/{id}Blocks

Retrieve a block

id:path*Notion-Version:header
PATCH
/v1/blocks/{id}Blocks

Update a block

id:path*Notion-Version:header
GET
/v1/blocks/{id}/childrenBlocks

Retrieve block children

id:path*page_size:queryNotion-Version:header
PATCH
/v1/blocks/{id}/childrenBlocks

Append block children

id:path*Notion-Version:header
GET
/v1/commentsComments

Retrieve comments

block_id:querypage_size:queryNotion-Version:header
GET
/v1/databases/{id}Databases

Retrieve a database

id:path*Notion-Version:header
PATCH
/v1/databases/{id}Databases

Update a database

id:path*Notion-Version:header
POST
/v1/databases/{id}/queryDatabases

Query a database

id:path*Notion-Version:header
GET
/v1/pages/{id}Pages

Retrieve a Page

id:path*Notion-Version:header:header
PATCH
/v1/pages/{id}Pages

Update Page properties

id:path*Notion-Version:header
GET
/v1/pages/{page_id}/properties/{property_id}Pages

Retrieve a Page Property Item

page_id:path*property_id:path*

1 more endpoints not shown. See the OpenAPI spec for the full list.

09

Tags

10

Alternatives to consider

Different providers solving similar problems. Picked by category, auth, pricing, and tag overlap.