API reference
Rate limits and quotas
How each Kanorio API limits request rates, which headers tell you where you stand, and the plan quotas that cap stored resources.
Rate limits keep one integration from slowing down everyone else. They are counted per credential on the Management API and per site, visitor or customer on the public APIs. Quotas are a different thing: they cap how much a site can store, such as collection items or webhook endpoints, and depend on the plan.
When you hit a limit
The API returns 429 with code RATE_LIMITED and a Retry-After header in seconds. Wait at least that long, then retry with backoff.
{ "error": { "code": "RATE_LIMITED", "message": "Too many requests.", "details": { "retryAfter": 12 } } }
Some operations return 429 with a more specific code when the backend is busy rather than when you sent too much, for example SEARCH_BUSY or ANALYTICS_BUSY. Handle them the same way.
Management API
Each token has its own budget. Most operations share the default tier. Analytics queries are heavier, so they have a lower tier per token and a cap per site that every token on that site shares. REST and MCP calls count against the same budgets.
Each operation in the Management API reference shows its tier, and the OpenAPI document carries it as x-kanorio-rate-limit.
Content Delivery API
Responses served from the edge cache are not counted, so a busy site with a warm cache never hits these limits. Cache misses, form writes, analytics beacons and draft previews are counted in token buckets: each bucket refills at a steady rate and allows a short burst. Counted responses carry these headers:
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Bucket size |
X-RateLimit-Remaining | Requests left right now |
X-RateLimit-Reset | Seconds until the bucket is full again |
Build pages on your server or at build time where you can, and let the edge cache absorb visitor traffic.
Customer API
Signed-in calls are limited per customer token. Sign-in requests are limited per IP address.
Limits and quotas today
The values below are generated from the same constants the APIs enforce.
Management API tiers
| Tier | Limit | Applies to |
|---|---|---|
| default | 120/minute per token | Every operation not listed below |
| heavy | 20/minute per token, plus 20/minute per site | Analytics queries (analytics.*); REST and MCP share the bucket |
| publish | 30/hour per token | Publishing and unpublishing |
Content Delivery API buckets
Cache hits are not counted. Only requests that miss the edge cache, form writes and analytics beacons use these buckets.
| Bucket | Limit |
|---|---|
| Cache misses per site | 20 requests/second, burst 100 |
| Cache misses per visitor IP | 10 requests/second, burst 30 |
| Draft preview per IP | 2 requests/second, burst 20 |
| Gated content per customer token | 5 requests/second, burst 30 |
Customer API buckets
| Bucket | Limit |
|---|---|
| Per customer token | 5 requests/second, burst 30 |
| Sign-in (challenge and verify) per IP | 1 requests/second, burst 10 |
Plan quotas
| Resource | Free | Pro | Business |
|---|---|---|---|
| Collection items included | 50 | 1,000 | 10,000 |
| Storage included | 200 MB | 10 GB | 200 GB |
| Custom domains | 0 | 1 | 5 |
| Webhook endpoints per site | 10 | 10 | 10 |
| Rows per import batch | 100 | 1,000 | 2,000 |