| Plan | Applies to | Minute limit | Daily limit | Keyed by |
| Free | /api/v1/public/* | 50 requests / 10 seconds | — | Client IP at the edge |
| Pro | Authenticated realtime API | 30 requests/minute | 20,000/day | Clerk organization |
| Premium | Authenticated realtime API | 180 requests/minute | 150,000/day | Clerk organization |
| Header | Meaning |
RateLimit-Limit | Plan requests per minute. |
RateLimit-Remaining | Requests left in the current minute. |
RateLimit-Reset | Seconds until the minute counter resets. |
RateLimit-Daily-Limit | Plan requests per UTC day. |
RateLimit-Daily-Remaining | Requests left today. |
RateLimit-Daily-Reset | Seconds until 00:00 UTC. |
429 Too Many Requests, the same headers with the
exhausted remaining value at zero, and Retry-After for the binding budget:123456{ "error": "rate_limited", "limit": "rpm", "message": "Organization rpm request limit exceeded; retry after 18s.", "upgrade_url": "https://adjacent.markets/subscribe" }
Retry-After seconds. upgrade_url points at the plan
catalog, where a larger allowance can be bought; it is omitted when no plan is
available to buy.403 Forbidden:12345{ "error": "Insufficient scope: a Pro or Premium API plan is required", "status": 403, "upgrade_url": "https://adjacent.markets/subscribe" }
upgrade_url carries the same meaning as on a 429 and is likewise omitted when
no plan is available to buy. Unlike a 429 this is not worth retrying: nothing
resets, and the request succeeds only once the organization holds a plan.