Notion API rate limits, the official numbers
You came here for one number. You should get it in the first screen, not the fifth. Here it is, copied straight from Notion's developer docs and re-verified the day this page was written.
An average of 3 requests per second per integration.
Some bursts beyond the average rate are allowed. Requests that exceed the limit return HTTP 429 with a rate_limited error code and a Retry-After header containing a decimal number of seconds. The limit attaches to the integration token, not the workspace or the user.
Source: developers.notion.com/reference/request-limits. Notion notes that values may change, so re-check this page before sizing anything load-bearing.
The size caps that quietly break you first
The 3-per-second number gets all the attention. In practice, most of the production bugs I see on Notion integrations are not throttling. They are size errors that look like throttling because the call comes back with no useful body. Here are the per-request hard caps Notion publishes, in the same place as the rate limit.
| Constraint | Limit | Where it bites |
|---|---|---|
| Requests per second | 3 average | Bulk syncs, dashboard polling |
| Blocks per request | 1000 | Pasting a long doc, importing a page |
| Total payload | 500 KB | Embedded images, large text blocks |
| Rich text content | 2000 chars | Long paragraphs in one block |
| URL field | 2000 chars | Tracked links with long query strings |
| Equation expression | 1000 chars | Long LaTeX equations |
| Array elements | 100 | Multi-select options, relations, mentions |
| Email and phone fields | 200 chars each | CRM-shaped properties |
The 1000-block and 500KB caps are what you hit when you write an importer or sync. They produce a clean validation error, not a 429, so you do not retry your way out. The fix is chunking on the way in, which a queue gets you for free but a naive loop does not.
“2700 calls every 15 minutes per token. That is the same 3 per second, just averaged over a longer window so a short burst does not page anyone.”
The 15-minute window is the practical one to design against. If your sync runs 4 requests per second for 8 seconds then idles for two minutes, you are still under budget. If you run 3 per second flat for 16 minutes you will eventually 429 even though the instantaneous rate is on spec.
The workaround nobody writes about
The standard advice for hitting the limit is well known: queue, batch, exponential backoff, cache and diff. There is a fifth path that almost nobody writes up because it sounds wrong at first. You can simply not call the API. Drive the Notion macOS app through the accessibility tree the operating system already exposes, and your throughput is governed by UI latency and your own pacing, not by Notion's server-side rate limiter.
Two paths to the same workspace
Your script signs a request with an integration token and hits api.notion.com. Notion's rate limiter counts the call. After 2700 calls in 15 minutes you get HTTP 429 and a Retry-After header. You queue, back off, or split the job.
- Counted against 3/sec average per token
- Hits 1000-block and 500KB ceilings on writes
- Cleanly scriptable, ideal for high-frequency reads
- Same budget whether you are on Free, Plus, Business, or Enterprise
This is what Fazm uses for Notion specifically. The desktop app has a complete accessibility tree on macOS. An agent can walk it, identify the right database row, click into a page, type into a field, and confirm the write landed, all without authenticating against api.notion.com. Notion's own desktop client has no rate limit on what your hands can do, and accessibility-driven automation is, to the OS, just a faster pair of hands.
Why the OS path sidesteps the limit
Both paths end at the same Notion database. The difference is everything between you and that database. One traverses Notion's rate-limited public boundary. The other goes through your own logged-in session via the operating system.
Same destination, two routes
The top route on the right is the one every guide tells you to optimize. The middle route is the one nobody covers, because most people writing about the Notion API are not also writing about macOS accessibility APIs. They are two different stacks. When you have an agent that already speaks both, the choice becomes a per-workflow decision instead of a religious one.
When the OS path is the right call
UI automation is not always the answer. It is the answer for a specific shape of work. Here is the honest version of when it pays off and when it does not.
Pick the desktop app path if
- You are hitting the 1000-block or 500KB limit on imports
- Your job runs daily or weekly, not every minute
- You already have an AI agent driving your Mac for other tasks
- You want one workflow that touches Notion plus other Mac apps in the same flow
- You need a synchronous read endpoint that returns in under 200ms
- You are syncing tens of thousands of rows per minute
- You run on Linux or Windows servers with no Mac in the loop
The first four are the workflows where Fazm is the natural fit. The last three are the ones where you should stay on the public API and design around the 3-per-second budget, or move the data to a database that can keep up.
What about plan-based limits?
Notion's developer docs say, verbatim, that they plan to introduce distinct rate limits for workspaces in different pricing plans. That sentence has been on the page for a while now and the limits have not yet diverged in public docs. Today, the Free, Plus, Business, and Enterprise plans share the same 3-per-second average and the same per-request size caps. If higher limits ship on a paid plan in the future, Notion will update the same page where the 3-per-second number lives. The honest answer for now is that there is no paid escape hatch from the rate limit on api.notion.com.
That makes the per-workflow decision more interesting, not less. If the limit were just a free-tier nudge, the right answer would be a sales call. Since it applies to every plan, the right answer depends on the shape of the work.
Build a Notion workflow that does not depend on the API
If you are routinely hitting 429s or the 1000-block ceiling, the right shape might be a Mac-resident agent driving the desktop app instead. Walk through your sync with us.
Frequently asked questions
What is the official Notion API rate limit?
Notion's developer docs state an average of three requests per second per integration. Some bursts beyond the average rate are allowed. Requests that exceed the limit return HTTP 429 with a rate_limited error code and a Retry-After header in decimal seconds.
Is the 3 requests per second limit per integration, per workspace, or per user?
Per integration. The limit attaches to the API token, which is scoped to one integration. A Notion engineer publicly described the underlying budget as 2700 calls every 15 minutes per token, which is the same 3 per second averaged over the window.
Does Notion offer paid plans with higher API rate limits?
Not today. Notion's docs say rate limits may change and that they plan to introduce distinct rate limits for workspaces in different pricing plans, but at the time of this writing the same 3 per second average applies regardless of plan. There is no paid tier you can buy to lift it right now.
What payload size limits does the Notion API enforce on top of the rate limit?
1000 block elements and 500KB total per request. Rich text content and URLs are capped at 2000 characters each. Equation expressions at 1000 characters. Arrays at 100 elements, including multi-select options, page relations, and people mentions. Email and phone number fields at 200 characters.
What does the Retry-After header on a 429 response actually contain?
An integer number of seconds, formatted as a decimal value, indicating the minimum amount of time you should wait before retrying. Notion recommends either respecting that value directly or implementing your own request queue that progressively slows your request velocity.
Can I bypass the API rate limit by automating the Notion desktop app instead?
Yes, technically. The 3 per second limit applies to api.notion.com. The Notion macOS app is an Electron wrapper whose UI is fully exposed through macOS accessibility APIs. An agent that drives the desktop app through that tree never hits the public API, so there is no rate limit on the OS side. The tradeoff is speed: clicks and field updates run at human UI speed, not at API speed, so this is the right answer for batch and longer-running flows, not for synchronous high-throughput pipelines.
Does the SDK retry automatically on a 429?
The official @notionhq/client and notion-sdk-py do not implement automatic retry on 429 out of the box. You have to wrap your calls or use a request queue. There are community libraries that add this for you, and the SDKs do surface the Retry-After header value through their typed error objects.
Where exactly does Notion publish these limits?
On the Request limits page in their developer docs, at https://developers.notion.com/reference/request-limits. That page is the only authoritative source. Re-check it before trusting any number here, including the ones on this page, because Notion has said the values may change.
Related deep dives
Accessibility tree computer use, the six signals a screenshot cannot carry
What the macOS accessibility tree gives an agent that a screenshot pass has to guess. Role, subrole, accessible title, frame, state, visibility.
Accessibility tree desktop automation
How desktop automation works when an agent reads the OS-level UI tree instead of taking screenshots and asking a vision model to guess.
Notion AI features April 2026 and how to extend them
Voice input on desktop, shareable AI chats, and AI meeting notes. How to use them as triggers for cross-app workflows.
Comments (••)
Leave a comment to see what others are saying.Public and anonymous. No signup.