Rate limits and plan rules
Onplana counts requests and refuses the ones over a limit, so one busy client cannot slow the service down for everyone else. This page lists the limits, read from the code that enforces them, and the plan each way in needs.
When you hit a limit
Section titled “When you hit a limit”A refused request answers HTTP 429 Too Many Requests. The response
carries a Retry-After header: the number of seconds until the window
resets. Wait that long, then send the request again. Read the header
rather than the JSON body, because the body’s fields are not the same on
every route.
Responses counted by the API limits below also carry X-RateLimit-Limit (the limit),
X-RateLimit-Remaining (what is left in this window) and
X-RateLimit-Reset (when the window resets, in Unix seconds), so a client
can slow down before it is refused.
The API
Section titled “The API”Limits are per minute and depend on the organization’s plan. Each window starts with the first request counted in it.
| Route family | Counted per | Free | Professional | Business | Enterprise | Enterprise+ | Window |
|---|---|---|---|---|---|---|---|
| Personal access tokens and OAuth tokens (REST, MCP) | Token | 30 | 120 | 300 | No limit | No limit | 1 minute |
Signed-in requests to /api that name an organization |
Organization | 200 | 800 | 1200 | No limit | No limit | 1 minute |
A request made with a token counts against that token. The organization
limit counts requests that carry the X-Organization-Id header, which is
how the web app calls the API. A token request needs no such header; one
that sends it anyway counts against both.
Free tools on onplana.com
Section titled “Free tools on onplana.com”The free tools on the public site answer without a sign-in, so they are counted per visitor, per file and per email address instead of per organization. These limits are the same on every plan.
AI Gantt chart generator
Section titled “AI Gantt chart generator”Route family: /api/public/ai-gantt
| Counted | Requests | Window |
|---|---|---|
| Open the tool, per IP address | 60 | 1 hour |
| Generate, per IP address | 20 | 1 hour |
| Generate, per IP address, daily | 50 | 1 day |
| Generate, across all visitors | 200 | 1 day |
| Unlock the full result by email, per IP address | 10 | 1 hour |
| Unlock the full result, per email address | 3 | 1 day |
| Open the result in a free workspace, per IP address | 3 | 1 hour |
| Open the result in a free workspace, per result | 3 | 1 hour |
| Optimize with AI, per IP address | 10 | 1 hour |
| Optimize with AI, per result | 5 | 1 hour |
Maturity assessment
Section titled “Maturity assessment”Route family: /api/public/maturity-assessment
| Counted | Requests | Window |
|---|---|---|
| Open the tool, per IP address | 60 | 1 hour |
| Submit answers, per IP address | 30 | 1 hour |
| Unlock the full result by email, per IP address | 10 | 1 hour |
| Unlock the full result, per email address | 3 | 1 day |
Migration cost calculator
Section titled “Migration cost calculator”Route family: /api/public/migration-cost-calculator
| Counted | Requests | Window |
|---|---|---|
| Open the tool, per IP address | 60 | 1 hour |
| Estimate, per IP address | 30 | 1 hour |
| Unlock the full result by email, per IP address | 10 | 1 hour |
| Unlock the full result, per email address | 3 | 1 day |
Migration preview and file export
Section titled “Migration preview and file export”Route family: /api/public/migration-preview, /api/public/migration
| Counted | Requests | Window |
|---|---|---|
| Open the tool, per IP address | 60 | 1 hour |
| Analyze a file, per IP address | 20 | 1 hour |
| The same file again (by its hash) | 5 | 1 day |
| Unlock the full result by email, per IP address | 10 | 1 hour |
| Unlock the full result, per email address | 3 | 1 day |
Resource heatmap
Section titled “Resource heatmap”Route family: /api/public/resource-heatmap
| Counted | Requests | Window |
|---|---|---|
| Open the tool, per IP address | 60 | 1 hour |
| Analyze a file, per IP address | 20 | 1 hour |
| The same file again (by its hash) | 5 | 1 day |
| Unlock the full result by email, per IP address | 10 | 1 hour |
| Unlock the full result, per email address | 3 | 1 day |
Resource leveler
Section titled “Resource leveler”Route family: /api/public/resource-leveler
| Counted | Requests | Window |
|---|---|---|
| Open the tool, per IP address | 60 | 1 hour |
| Upload a file, per IP address | 20 | 1 hour |
| Upload a file, per IP address, daily | 50 | 1 day |
| Unlock the full result by email, per IP address | 10 | 1 hour |
| Unlock the full result, per email address | 3 | 1 day |
| Open the result in a free workspace, per IP address | 3 | 1 hour |
| Open the result in a free workspace, per result | 3 | 1 hour |
Schedule health check and Onplana Schedule
Section titled “Schedule health check and Onplana Schedule”Route family: /api/public/schedule
| Counted | Requests | Window |
|---|---|---|
| The same file again (by its hash) | 5 | 1 day |
| The same file from one desktop install | 20 | 1 day |
| The same file from the desktop app, across everyone | 50 | 1 day |
| The same pasted plan again (by its hash) | 5 | 1 day |
| Unlock the full result, per email address | 15 | 1 day |
| Join the waitlist, per email address | 5 | 1 day |
| Join the waitlist, per IP address | 10 | 1 hour |
| Open the result in a free workspace, per IP address | 50 | 1 hour |
| Open the result in a free workspace, per result | 5 | 1 hour |
| Open the tool, per IP address | 120 | 1 minute |
| Desktop app upload, per IP address | 30 | 1 hour |
| Desktop app requests, per install | 60 | 1 day |
| Read a shared snapshot, per IP address | 120 | 1 minute |
| Unlock the full result by email, per IP address | 20 | 1 hour |
Schedule risk analyzer
Section titled “Schedule risk analyzer”Route family: /api/public/schedule-risk
| Counted | Requests | Window |
|---|---|---|
| Open the tool, per IP address | 60 | 1 hour |
| Upload a file, per IP address | 10 | 1 hour |
| Upload a file, per IP address, daily | 30 | 1 day |
| Unlock the full result by email, per IP address | 10 | 1 hour |
| Unlock the full result, per email address | 3 | 1 day |
| Open the result in a free workspace, per IP address | 3 | 1 hour |
| Open the result in a free workspace, per result | 3 | 1 hour |
Status report writer
Section titled “Status report writer”Route family: /api/public/status-report
| Counted | Requests | Window |
|---|---|---|
| Open the tool, per IP address | 60 | 1 hour |
| Generate, per IP address | 20 | 1 hour |
| Generate, per IP address, daily | 50 | 1 day |
| Generate, across all visitors | 500 | 1 day |
| Unlock the full result by email, per IP address | 10 | 1 hour |
| Unlock the full result, per email address | 3 | 1 day |
Which plan each door needs
Section titled “Which plan each door needs”| Door | Plans | Guide |
|---|---|---|
| REST API with a personal access token | Every plan | Guide |
| Webhooks | Business and above | Guide |
| OData reporting feed | Professional and above | Guide |
| MCP server for AI agents | Every plan | Guide |
The MCP server for AI agents counts concurrent connections by plan: Free 2, Professional 3, Business 5, Enterprise 10, Enterprise+ Unlimited.
See Build on Onplana for what each door is for, and the pricing page for the full plan comparison.
Was this helpful?
Thanks for your feedback!