The CardMind API enforces per-minute and monthly quotas to ensure fair access. Limits are tracked per API key using a sliding window and are returned as response headers on every request.
Limits apply to Bearer token requests only. Internal fleet callers (using X-Internal-Secret) are always unlimited.
| Tier | Per Minute | Per Month | Premium endpoints |
|---|---|---|---|
| Internal | Unlimited | Unlimited | ✓ Included |
| Free | 10 / min | 1,000 / mo | ✗ Not available |
| Premium | 60 / min | Unlimited | ✓ Included |
Monthly quotas reset at the start of each calendar month (UTC midnight, first of the month). The per-minute window uses a sliding window — not a fixed clock minute.
Every successful API response includes these headers so you can track your remaining quota and implement backoff logic without waiting for a 429.
| Header | Type | Description |
|---|---|---|
| X-RateLimit-Limit | integer | The binding limit — whichever quota is currently most restrictive (per-minute or monthly) |
| X-RateLimit-Remaining | integer | Calls remaining before the binding limit is hit |
| X-RateLimit-Reset | Unix timestamp (s) | When the current window resets — a Unix timestamp in seconds (UTC) |
HTTP/2 200 OK
Content-Type: application/json
X-RateLimit-Limit: 10
X-RateLimit-Remaining: 7
X-RateLimit-Reset: 1745000060In this example, a free-tier key has used 3 of its 10 per-minute calls. The window resets at Unix timestamp 1745000060.
When your quota is exceeded the API returns HTTP 429 with a RATE_LIMITED error code. The rate limit headers are included on 429 responses — use X-RateLimit-Reset to determine when to retry.
{
"data": null,
"error": {
"message": "Rate limit exceeded",
"code": "RATE_LIMITED"
}
}const res = await fetch('https://api.cardmind.app/api/cards/search?q=bolt', {
headers: { Authorization: 'Bearer cm_live_YOUR_KEY' },
})
if (res.status === 429) {
const resetAt = Number(res.headers.get('X-RateLimit-Reset')) * 1000
const waitMs = Math.max(resetAt - Date.now(), 1000)
await new Promise(r => setTimeout(r, waitMs))
// retry request...
}/api/collection/value, /api/webhooks, /api/ai/analyze) return 403 PREMIUM_REQUIRED for free-tier keys — these do not consume quota.Upgrade to CardMind Premium for 60 requests per minute, unlimited monthly calls, and access to premium endpoints including AI card analysis, collection valuation, and webhooks.