Rate limits
Usage limits per plan
We apply rate limit per API key, in a 1-hour rolling window. Direct uploads to R2 with presigned URLs do NOT count against this limit — only /v1/* endpoint calls count.
Limits per plan
| Plan | Requests/hour | Notes | |
|---|---|---|---|
| Free | 100 | — | Enough to evaluate and integrate. |
| Pro | 1.000 | — | Covers most imaging centers. |
| Clinic | 5.000 | — | For PMS or marketplace integrations. |
| Ultra | 10.000 | — | Standard ceiling. Above this request Enterprise. |
| Enterprise | > 10,000 (custom) | — | Custom agreement + dedicated SLA. Email soporte@cbcthub.com. |
Sandbox keys (cbct_test_*) use a separate bucket with 1,000 req/h, independent of plan. They do not consume your production quota.
You can see real-time consumption per key at /dashboard/api/usage (hourly chart, calls per endpoint and recent 429s).
When you exceed the limit
http
HTTP/1.1 429 Too Many Requests
Retry-After: 1847
X-RateLimit-Limit: 1000
X-RateLimit-Reset: 1780201234
{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded (1000 requests/hour). Retry in 1847s.",
"retry_after_seconds": 1847
}
}Response headers
On every 429 response we include these headers so you can implement backoff correctly:
Retry-After— seconds until the window resetsX-RateLimit-Limit— your current hourly limitX-RateLimit-Reset— Unix timestamp when it resets
Best practices
- Cache GET /v1/me responses — do not call it before every operation.
- For batch uploads, parallelize with a semaphore (e.g. 10 concurrent).
- If you need >10,000 requests/hour sustained, contact us: we set up a custom Enterprise agreement.